gcc没有将.o中的符号链接到应用程序中

时间:2014-10-25 11:12:36

标签: g++ shared-libraries undefined-symbol

我试图将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# 

1 个答案:

答案 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,适合链接到主可执行文件。