我使用的是64位CentOS版本的Linux。我正在尝试在我的C和C ++程序中创建和使用静态库(libUtility.a)。我可以用C编译库,并用ar生成libUtility.a文件。然后我尝试将其链接到我的程序中。当我使用C编译器
时,一切正常cc myprog.c -o myprog -I/usr/local/include -L/LocationOfMyLib -lUtility
但是,当我使用g ++编译器时,我会收到错误。
g++ myprog.c -o myprog -I/usr/local/include -L/LocationOfMyLib -lUtility
myprog.c: In function 'int main(int, char**)':
/tmp/cckIN1Yk.o: In function `main':
myprog.c:(.text+0x41): undefined reference to `Utility_HiWorld(char*)'
collect2: ld returned 1 exit status
我在C和C ++方面经验丰富,但没有创建自己的经验 库。该库只有一个名为Utility_HiWorld()的子程序。并且myprog.c只调用一个子例程。我在这里做错了什么?
新:好的,我绝对没有使用'extern“C”'。我甚至不知道那是什么。这解决了它。
答案 0 :(得分:4)
我猜你没有告诉你的C ++编译器外部函数是用C语言编写的。
由于你想使用C和C ++中的库,你需要在库头文件中做这样的事情。
#ifdef __cplusplus
extern "C" {
#endif
void Utility_HiWorld(char*);
#ifdef __cplusplus
}
#endif
__cplusplus
仅为C ++程序定义,因此C ++程序将看到extern "C" { ... }
,它需要告诉它Utility_HiWorld
是一个C函数。
有关详细信息,请参阅here。
只是一个猜测,如果您认为问题是其他原因,请发布一些代码。