C / C ++链接问题与一个非常简单的设置

时间:2017-06-15 20:21:59

标签: c++ c linker g++

我得到了一个"未定义的引用"尝试编译和链接一个非常简单的依赖于第三方库的应用程序时出错。

我的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的人,所以我是可能在这里遗漏了一些非常基本的东西...

1 个答案:

答案 0 :(得分:2)

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

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