未定义的引用,即使库是链接并且它包含正确的符号

时间:2018-06-12 16:10:11

标签: c++ compilation linker

我正在尝试使用Makefile中的这一行编译我的可执行文件:

g++-8.1.0 -Wall -Wextra -pthread -std=c++17 -ggdb3 -I/usr/local/include ./src/barometer.o ./src/serial.o ./src/ptpcontroller.o ./src/stream.o ./src/helper.o ./src/thetav.o ./src/gps.o ./src/flightcontroller.o ./src/gui.o ./src/maneuvers.o ./src/main.o ./src/fcinterface.o ./libs/NemaTode/src/NumberConversion.o ./libs/NemaTode/src/NMEAParser.o ./libs/NemaTode/src/GPSFix.o ./libs/NemaTode/src/NMEACommand.o ./libs/NemaTode/src/GPSService.o ./libs/ptpcam/ptpcam.o -o halo -L/usr/local/lib -lwiringPi -lrt -lpigpio -lncurses -lptp2 -lusb

我得到了很多未定义的引用错误:

./libs/ptpcam/ptpcam.o: In function `init_ptp_usb(_PTPParams*, _PTP_USB*, usb_device*)':
/home/pi/ProjectHaloDrone/RPiCM3/libs/ptpcam/ptpcam.cpp:322: undefined reference to `ptp_usb_sendreq(_PTPParams*, _PTPContainer*)'

即使所有这些符号都在我使用-lptp2链接的libptp2库中:

pi@raspberrypi:~/ProjectHaloDrone/RPiCM3 $ nm -g /usr/local/lib/libptp2.so | grep ptp_usb_sendreq
00002d3c T ptp_usb_sendreq

我很困惑为什么链接器认为符号没有定义......

1 个答案:

答案 0 :(得分:0)

链接器将未解析的外部符号报告为ptp_usb_sendreq(_PTPParams*, _PTPContainer*)这一事实意味着这些符号以C ++方式被破坏(否则,函数参数将不可见)。

与此同时,nm会将符号报告为ptp_usb_sendreq,这意味着它不会受损。

最有可能的解决方案:检查并确保您的函数签名(可能在头文件中)包含在extern "C"说明符中。