gcc - 未定义的引用,但库包含匹配的符号

Gcc - Undefined reference but library contains matching symbol

本文关键字:包含匹 符号 未定义 引用 gcc      更新时间:2023-10-16

我试图将我的一个程序与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>
}

现在它编译得很好。谢谢!