我得到了一个"未定义的引用"尝试编译和链接一个非常简单的依赖于第三方库的应用程序时出错。
我的main.c看起来像这样:
#include "ss7cp.h"
/*
extern "C" {
void EINSS7CpMain_CpInit(void);
}
*/
int main() {
EINSS7CpMain_CpInit();
}
第三方头文件包含:
#if defined (__cplusplus) || defined (c_plusplus)
extern "C" {
#endif
...
void EINSS7CpMain_CpInit(void);
此功能的定义在档案中:
$ nm -g /path/to/lib/libsign_64_uthr.a | grep EINSS7CpMain_CpInit 0000000000005ae0 T EINSS7CpMain_CpInit U EINSS7CpMain_CpInit U EINSS7CpMain_CpInit
通过" T"上面,该函数必须在存档中某个库的文本/代码部分中定义。
我目前没有使用Makefile,只是尝试完全从命令行快速构建这个简单的应用程序:
g++ -I/path/to/include -L/path/to/lib -lsign_64_uthr -D__EXTENSIONS__ -DLINUX main.c
(文档告诉我要定义__EXTENSIONS__
和LINUX
)。以上其余部分非常简单。我得到的是:
/tmp/ccvgmIJ8.o: In function `main': main.c:(.text+0x5): undefined reference to `EINSS7CpMain_CpInit' collect2: error: ld returned 1 exit status
我已经尝试过将其作为C文件(main.c)和C ++文件(main.cpp,启用extern "C"
块),但没有区别。 (我可以假设g ++仅通过文件扩展名来决定C与C ++吗?)
我甚至只编译了文件(使用-c
)并查看了生成的main.o对象文件的内容,并看到了文本" EINSS7CpMain_CpInit"实际上,没有un(或者可能只是一个调试符号?)
我可以采取哪些诊断步骤来查看我失踪的内容?我是否真的需要创建一个Makefile并拆分编译和链接步骤?
自从我上次使用任何C / C ++以来,已经很久了,甚至在我做完之后,我通常不是那个必须从头开始创建Makefile的人,所以我是可能在这里遗漏了一些非常基本的东西...
答案 0 :(得分:2)
我最好的猜测是参数排序,lib应该在源文件之后:
g++ -I/path/to/include -D__EXTENSIONS__ -DLINUX main.c -L/path/to/lib -lsign_64_uthr