简体   繁体   中英

Including functions with extern C linkage in library

I have included some C functions with extern c linkage in c++ code. Eg

// File Y.cpp: 

extern C {  
 void fnA(void) { }  
 void fnB(void* a, void* b) { }  
}

class test {
....
};

// end of file

File Y is under module Mod. While building library libMod-Oa for module Mod, I don't see the functions under extern block included, unless Yh is included in some other file (Mod.cpp) and the class test is used. So unless I create an object of test class in Mod.cpp, I do not see the extern functions (fnA, fnB) in the libMod-Oa, even through Y.cpp is compiled during build of libMod-Oa The result of this is that linker error happens as another module uses fnA, fnB.

I do not see the connection between the extern functions fnA and fnB being included and usage of class test in Mod.cpp. Is this expected or is there a better way to define this?

You mean extern "C" of course.

You need to have a clean separation between your C code and your C++ code.

In YourCCode.h:

#ifdef __cplusplus
extern "C" {
#endif

void fnA(void);
void fnB(void* a, void* b);

#ifdef __cplusplus
}
#endif

In YourCCode.c:

void fnA(void) {}
void fnB(void* a, void* b) {}

Make sure your compiler compiles YourCCode.c as C, not as C++.

In your C++ code

#include "YourCCode.h"

fnA();
// etc.

you might have a link order problem where the files that use fnA come after the link of libMod-Oa but where Mod.cpp with object test comes before libMod-Oa so the obj file is pulled in before fnA/fnB are needed later. the gnu linker is a single pass linker by default.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM