C / C++链接问题与非常简单的设置
C/C++ linking issue with a very simple setup
我在尝试编译和链接依赖于第三方库的非常简单的应用程序时收到"未定义的引用"错误。
我的 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
相关文章:
- 一个非常简单的win32套接字代码,但工作错误
- 无法使用crfsuite的C++ API编译一个非常简单的Tagger示例
- C++中一个非常简单的枚举类错误
- C / C++链接问题与非常简单的设置
- 理解循环,非常简单
- 我正在写一个非常简单的字母评分系统,if语句是最有效的吗?
- 非常简单的C 文本冒险的代码结构
- 为什么在 v8 中运行嵌入在 c++ 中的非常简单的脚本会占用内存?
- boost/asio:非常简单的聊天服务器无法访问收到的消息
- DirectX 11 - 如何创建非常简单的 2D 纹理
- 如果将功能的非常简单的定义移动到.cpp,则编译时间的减少是多少
- 在C 中编写一个非常简单的事件类
- Winapi中使用ListBox的非常简单的示例
- 在使用Qt Creator创建一个非常简单的项目时,在Qt中遇到"segmentation fault"
- 非常简单C++基本代码
- 需要非常简单的循环C++帮助
- C++非常简单的未解决外部
- Clang编译器错误,适用于非常简单的程序
- 非常简单的 x64 组装/C++应用程序中未解决的外部错误
- 错误:在非常简单的示例中,预期的构造函数、析构函数或类型转换