gcc - 未定义的引用,但库包含匹配的符号
Gcc - Undefined reference but library contains matching symbol
我试图将我的一个程序与libmodbus开源库链接起来。在自动制作遇到了一些麻烦之后,我终于设法编译了它。
但是现在当我使用库在我自己的程序中提供的函数之一时,我从 gcc 收到一个未定义的引用错误:
main.cpp:(.text+0x21): undefined reference to `modbus_udp_init(char*, int, __modbus_udp_handle*)'
collect2: Fehler: ld gab 1 als Ende-Status zurück
从我的角度来看,gcc 编译我的项目的论点是正确的:
g++ -v -I ../libmodbus/modbus -o main main.cpp -L../libmodbus/modbus/.libs/ -lmodbus
我与nm
一起检查了该函数是否真的在该库中,但对我来说一切看起来都很好(我已经从输出中删除了一些部分,以防止输出变得太大):
$ nm ../libmodbus/modbus/.libs/libmodbus.a
modbus.o:
0000000000000590 T crc16
U free
U malloc
U memcpy
0000000000000b40 T modbus_diagnostics
0000000000000d90 T modbus_error_get_exception_code
0000000000000100 C modbus_error_str
0000000000000cf0 T modbus_exception
[...]
modbus-udp.o:
U bcopy
U close
U __errno_location
U gethostbyname
U modbus_error_str
U modbus_tcp_frame_pack
U modbus_tcp_frame_parse
0000000000000000 T modbus_udp_close
0000000000000030 T modbus_udp_init
0000000000000220 T modbus_udp_recv
0000000000000190 T modbus_udp_send
0000000000000010 r __PRETTY_FUNCTION__.4582
0000000000000000 r __PRETTY_FUNCTION__.4592
U recvfrom
U sendto
U setsockopt
U snprintf
U socket
U strerror
modbus-tcp.o:
[...]
modbus-serial.o:
[...]
有人知道为什么 gcc 无法解析符号吗?
正如noloader所建议的那样,我错过了添加extern "C"
,因为libmodbus是一个C库。我编辑了我的来源:
extern "C" {
#include <modbus.h>
#include <modbus-udp.h>
}
现在它编译得很好。谢谢!
相关文章:
- 'dlopen''ing 包含符号的 .so 会导致未定义的符号
- 是否可以将无符号字符数组reinterpret_cast到仅包含C++中无符号字符成员的结构指针
- 未定义的引用,即使库正在链接并且它包含正确的符号
- 如何对包含数字和符号的字符串进行排序?
- 如何将 32 位无符号整数分配给包含 32 位的位字段
- 如何在C 中正确定义包含科学符号的整数矢量
- Visual C :如何找到哪个标准库包含缺失的外部符号
- 当字符包含表情符号时如何比较字符?
- G++ 切换为不包含自己的符号函数名称(和调试数据)-
- 包含类文件后的错误消息(多个定义的符号)
- OpenNN在Visual Studio 2017中包含未解析的外部符号
- 无符号整数数组怎么可以包含负整数
- 将项目符号包含目录与 cmake 链接
- 包含MFC对象库时未解析的外部符号
- 什么是包含符号常数的结构的现代C++方法
- 最小的无符号整数,可以包含给定有符号积分的正值
- 带有正确包含保护的C++重复符号链接器错误
- 如何在python中将包含十六进制值的无符号char*数组写入文件
- 链接来自包含相同符号的不同项目的两个对象文件时发生C++链接器错误
- 如何在没有文件、objdump或gdb的情况下知道二进制文件是否包含调试符号