我试图将c ++ .o文件链接到应用程序(也是c ++)。这是构建线:
g ++ -o ../objs/armv5sfLinux3.2gcc4.6.2.EV3/Touch_publisher ../objs/armv5sfLinux3.2gcc4.6.2.EV3/Touch_publisher.o ../objs/armv5sfLinux3.2gcc4.6.2.EV3/EV3_Touch .o ../objs/armv5sfLinux3.2gcc4.6.2.EV3/EV3_TouchPlugin.o ../objs/armv5sfLinux3.2gcc4.6.2.EV3/EV3_TouchSupport.o ../ev3/ev3dev.o -L / host-rootfs / home /rip/nfs/ev3dev/ndds.5.1.0/lib/armv5sfLinux3.2gcc4.6.2.EV3 -lnddscppz -lnddscz -lnddscorez -ldl -lnsl -lm -lpthread -lrt -lstdc ++
有问题的.o是../ev3/ev3dev.o文件。构建之后,我得到了Touch_publisher应用程序,但nm报告:
root@arundel:~/rti_510/Touch# nm ../objs/armv5sfLinux3.2gcc4.6.2.EV3/Touch_publisher | grep ev3 | grep " U "
U _ZN6ev3dev12touch_sensorC1ESs
U _ZNK6ev3dev12touch_sensor7pressedEv
U _ZNK6ev3dev6sensor9type_nameEv
如果我在ev3dev.o上做nm,对于缺失的符号,我会得到例如。
root@arundel:~/rti_510/Touch# nm ../ev3/ev3dev.o | grep _ZN6ev3dev12touch_sensorC1ESs
0000ee5c T _ZN6ev3dev12touch_sensorC1ESs
root@arundel:~/rti_510/Touch#
所以有一个符号。以上是我不知道的细节? " T"意味着它是一个外部符号......
我在命令行上错过了一些深奥的旗帜吗? ev3dev.o文件使用以下命令构建:
BUILD:
gcc -std=c++11 -shared -fpic -march=armv5t -mfloat-abi=soft -mlong-calls -o ev3dev.o ev3dev.cpp
或许还有另一步?我已经尝试了' -Wl,-whole-archive,... / ev3 / ev3dev.o,-no-whole-archive'但仍然会得到那些讨厌的U符号。
我没有启用-O#optimizations。
我已经阅读了20个左右的类似问题("链接对象中缺少符号")
谢谢
附录:objdump而不是nm的结果:
root@arundel:/host-rootfs/home/rip/nfs/ev3dev/rti_510/Touch# objdump -T Touch_publisher | grep \*UND\* | grep ev3dev
00000000 DF *UND* 00000000 _ZNK6ev3dev12touch_sensor7pressedEv
00000000 DF *UND* 00000000 _ZNK6ev3dev6sensor9type_nameEv
00000000 DF *UND* 00000000 _ZN6ev3dev12touch_sensorC1ESs
root@arundel:/host-rootfs/home/rip/nfs/ev3dev/rti_510/Touch# objdump -t ../ev3/ev3dev.o | grep ev3dev | grep _ZNK6ev3dev12touch
0000f040 g F .text 00000058 _ZNK6ev3dev12touch_sensor7pressedEv
root@arundel:/host-rootfs/home/rip/nfs/ev3dev/rti_510/Touch# objdump -t ../ev3/ev3dev.o | grep ev3dev | grep _ZNK6ev3dev6sensor9type
0000dd10 g F .text 00000690 _ZNK6ev3dev6sensor9type_nameEv
root@arundel:/host-rootfs/home/rip/nfs/ev3dev/rti_510/Touch# objdump -t ../ev3/ev3dev.o | grep ev3dev | grep _ZN6ev3dev12touch
0000ee5c g F .text 000001e4 _ZN6ev3dev12touch_sensorC1ESs
0000ee5c g F .text 000001e4 _ZN6ev3dev12touch_sensorC2ESs
root@arundel:/host-rootfs/home/rip/nfs/ev3dev/rti_510/Touch#
答案 0 :(得分:2)
ev3dev.o文件使用:
构建BUILD:
gcc -std=c++11 -shared ... -o ev3dev.o ev3dev.cpp
这就是您的问题,就在那里:您已经构建了一个共享库并错误地将其命名为ev3dev.o
。
链接共享库的规则是,当您链接共享库时,它们不包含在主可执行文件中,因此毫无疑问ev3dev.o
未包含在Touch_publisher
中。
解决方案:如果希望-shared
成为正常(可重定位)目标文件,则-c
替换为ev3dev.o
,适合链接到主可执行文件。