当试图编译和链接一个非常简单的应用程序,依赖第三方库时,我收到“未定义的引用”错误。C/C++链接问题与一个非常简单的设置
我的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”原样,没有问题(或者这可能只是一个调试符号?)
什么是一些诊断步骤,我可以看看我失踪了什么?我是否真的需要创建一个Makefile并拆分编译和链接步骤?
自从我上次做了任何C/C++之后,甚至在我做这件事时甚至回来了,我通常不是必须从头开始创建Makefiles的人,所以我可能会错过一些非常基本的东西...
_“我可以假设G ++决定基于C与C++只是通过文件的扩展名?” _否 –
'nm -u main.o'给了我'U EINSS7CpMain_CpInit',所以我假设这不仅仅是一个名字的破坏问题? –
_“我可以采取哪些诊断步骤”_“nm”告诉您关于链接库中找到的符号的内容? –