On 03/15/2017 05:50 PM, Dilger, Andreas wrote: > On Mar 15, 2017, at 15:22, François Tessier <[email protected]> wrote: >> I get the same errors with g++ (v. 6.3). I can't find what kind of compiler >> flag I can use to be able to compile this. It clearly comes from how C++ >> deals with enum. The solutions I've found consist in "static_casting" the >> int values... Modifying my local version of lustre_user.h is probably not >> the best idea :-) > Have you tried adding the standard wrappers at the start and end of the > lustre_user.h header: > > #ifdef __cplusplus > extern "C" { > #endif > : > <rest of header> > #ifdef __cplusplus > } > #endif > > I thought we had added those long ago, but I don't see them in the header > today. If that fixes your problem, please file an LU ticket at > https://jira.hpdd.intel.com/ (and ideally a patch at > https://review.whamcloud.com/ too) and we can get this added to the header. > > In the meantime, you could also wrap your "#include <lustre/lustre_user.h>" > similarly. It doesn't fix the problem. I tried a more recent version of g++ or several compiler options to force the use of C++11 [1] but with no success. > Cheers, Andreas Cheers, François
[1] http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf >> On 03/15/2017 02:14 PM, Patrick Farrell wrote: >>> It looks like your compiler is being fussier than the C compiler. >>> >>> Specifically, the problem appears to be with the enum type. The C compiler >>> is happy to let pass using a short (cr_flags) where an enum is called for >>> (argument to changelog_rec_offset). In C, I think an enum is an int (so >>> passing in a short like this is always fine). I guess in C++ either enum >>> is not an int, or it's just fussier. >>> >>> There might be a compiler flag to make it not error on this? I am not >>> familiar with icpc, so I can't help with specifics. >>> >>> You might also try a different C++ compiler, to see if it has a different >>> attitude towards that error. >>> >>> One further thought, though: >>> This is a C header. Presumably, it is not intended to be included directly >>> in a C++ project? >>> >>> - Patrick >>> From: lustre-discuss <[email protected]> on behalf of >>> François Tessier <[email protected]> >>> Sent: Wednesday, March 15, 2017 2:00:31 PM >>> To: [email protected] >>> Subject: [lustre-discuss] Compile a C++ app. using the Lustre API >>> >>> Hi All, >>> >>> I'm working on a piece of code using the Lustre API. To do so, I include >>> lustreapi.h. When I compile my code with a C compiler (icc), everything >>> is fine. However, when I compile it with a C++ compiler (icpc), I get >>> these errors: >>> >>> --------------------------------- >>> >>> In file included from /usr/include/lustre/lustreapi.h(47), >>> from topo.c(5): >>> /usr/include/lustre/lustre_user.h(914): error: argument of type >>> "__u16={unsigned short}" is incompatible with parameter of type >>> "changelog_rec_flags" >>> return changelog_rec_offset(rec->cr_flags); >>> ^ >>> >>> In file included from /usr/include/lustre/lustreapi.h(47), >>> from topo.c(5): >>> /usr/include/lustre/lustre_user.h(925): error: a value of type "int" cannot >>> be used to initialize an entity of type "changelog_rec_flags" >>> enum changelog_rec_flags crf = rec->cr_flags & CLF_VERSION; >>> ^ >>> >>> In file included from /usr/include/lustre/lustreapi.h(47), >>> from topo.c(5): >>> /usr/include/lustre/lustre_user.h(935): error: a value of type "int" cannot >>> be used to initialize an entity of type "changelog_rec_flags" >>> enum changelog_rec_flags crf = rec->cr_flags & >>> ^ >>> >>> In file included from /usr/include/lustre/lustreapi.h(47), >>> from topo.c(5): >>> /usr/include/lustre/lustre_user.h(945): error: argument of type "int" is >>> incompatible with parameter of type "changelog_rec_flags" >>> return (char *)rec + changelog_rec_offset(rec->cr_flags & >>> ^ >>> >>> In file included from /usr/include/lustre/lustreapi.h(47), >>> from topo.c(5): >>> /usr/include/lustre/lustre_user.h(986): error: this operation on an >>> enumerated type requires an applicable user-defined operator function >>> crf_wanted &= CLF_SUPPORTED; >>> ^ >>> >>> In file included from /usr/include/lustre/lustreapi.h(47), >>> from topo.c(5): >>> /usr/include/lustre/lustre_user.h(997): error: argument of type "int" is >>> incompatible with parameter of type "changelog_rec_flags" >>> changelog_rec_offset(crf_wanted & ~CLF_JOBID); >>> ^ >>> >>> In file included from /usr/include/lustre/lustreapi.h(47), >>> from topo.c(5): >>> /usr/include/lustre/lustre_user.h(999): error: argument of type "int" is >>> incompatible with parameter of type "changelog_rec_flags" >>> changelog_rec_offset(crf_wanted & ~(CLF_JOBID | >>> CLF_RENAME)); >>> ^ >>> >>> Makefile:10: recipe for target 'topo' failed >>> make: *** [topo] Error 2 >>> >>> --------------------------------- >>> >>> It's probably more a compiler issue than a Lustre one but a solution >>> could help other users or Lustre developers. >>> >>> Any idea? >>> >>> Thanks, >>> >>> François >>> >>> >>> -- >>> -- >>> François TESSIER, Ph.D. >>> Postdoctoral Appointee >>> Argonne National Laboratory >>> LCF Division - Bldg 240, 4E 19 >>> Tel : +1 (630)-252-5068 >>> http://www.francoistessier.info >>> >>> _______________________________________________ >>> lustre-discuss mailing list >>> [email protected] >>> http://lists.lustre.org/listinfo.cgi/lustre-discuss-lustre.org >> _______________________________________________ >> lustre-discuss mailing list >> [email protected] >> http://lists.lustre.org/listinfo.cgi/lustre-discuss-lustre.org > Cheers, Andreas > -- > Andreas Dilger > Lustre Principal Architect > Intel Corporation > > > > > > > _______________________________________________ lustre-discuss mailing list [email protected] http://lists.lustre.org/listinfo.cgi/lustre-discuss-lustre.org
