0

我使用的是 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"'。我什至不知道那是什么。那解决了它。

4

1 回答 1

4

我猜你没有告诉你的 C++ 编译器外部函数是用 C 编写的。

由于您想使用 C 和 C++ 中的库,您需要在库头文件中执行类似的操作。

#ifdef __cplusplus
extern "C" {
#endif

void Utility_HiWorld(char*);

#ifdef __cplusplus
}
#endif

__cplusplus仅针对 C++ 程序定义,因此 C++ 程序将看到extern "C" { ... }它需要告诉它哪个是Utility_HiWorldC 函数。

有关更多详细信息,请参见此处

只是猜测,如果您认为问题出在其他地方,请发布一些代码。

于 2013-09-22T17:54:04.837 回答