我有一个共享库(在c ++中),它有一个函数foo()(声明为extern c),由一个由automake编译的C项目中的函数调用。所以我有一个makefile.am,它指向include.am,我已经将我的库/../Release/lib/libabc.so的名称和位置添加到xyz_LDADD变量中,正是我有 xyz_LDADD = libabc.so
foo的声明如下:
#ifdef __cplusplus
extern "C" {
#endif
void foo(void);
#ifdef __cplusplus
}
#endif
当我尝试制作时,我得到一个未定义的引用foo()错误。
如果我更改了d库abc的名称,我会收到错误,所以我假设编译器能够找到库。
我还有一些工作正常的静态库。 请有人帮忙吗...提前致谢
答案 0 :(得分:0)
要从c调用,必须使用extern "C"
或extern "C"
块声明c ++方法。
不仅在标题原型中,也在源头中。
要知道这是否是尝试在nm
工具中找到foo符号的原因。
nm ../Release/lib/libabc.so | grep foo
如果您看到foo
字,但未添加任何内容,则可以使用foo
声明extern "C"
方法,并且可以在c代码中使用该方法。如果你在名字之前或之后看到附加字符,那么它就是c ++,并且不能在c代码中使用它。