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

C/C++ linking issue with a very simple setup

本文关键字:非常 简单 设置 问题 C++ 链接      更新时间:2023-10-16

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

我的 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: 在函数 'main' 中: main.c:(.text+0x5):对"EINSS7CpMain_CpInit"的未定义引用 collect2:错误:ld 返回 1 个退出状态

我已经尝试了 C 文件 (main.c) 和C++文件(main.cpp,启用了extern "C"块),但没有区别。(我可以假设 g++ 仅通过文件扩展名决定 C 还是 C++?

我什至刚刚编译了文件(带有-c)并查看了生成的 main.o 对象文件的内容,并看到文本"EINSS7CpMain_CpInit"原样,未损坏(或者也许这只是一个调试符号?

我可以采取哪些诊断步骤来查看我缺少的内容?我真的需要创建一个生成文件并拆分编译和链接步骤吗?

自从我上次做任何 C/C++ 以来已经有很长时间了,甚至在我做的时候,我通常不是必须从头开始创建 Makefile 的人,所以我可能在这里错过了一些非常基本的东西......

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

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