2017-06-15 69 views
0

当试图编译和链接一个非常简单的应用程序,依赖第三方库时,我收到“未定义的引用”错误。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的人,所以我可能会错过一些非常基本的东西...

+1

_“我可以假设G ++决定基于C与C++只是通过文件的扩展名?” _否 –

+0

'nm -u main.o'给了我'U EINSS7CpMain_CpInit',所以我假设这不仅仅是一个名字的破坏问题? –

+0

_“我可以采取哪些诊断步骤”_“nm”告诉您关于链接库中找到的符号的内容? –

回答

2

我最好的猜测是参数排序,的lib应该来源文件后:

g++ -I/path/to/include -D__EXTENSIONS__ -DLINUX main.c -L/path/to/lib -lsign_64_uthr 
+0

是的,就是这样! –