2017-07-20 75 views
1

我对当前的C++ Linux项目有疑问。 我正在构建源代码并将其链接(IDE是QtCreator)到供应商提供的.o(不是.lib)文件。 在构建源文件时,似乎everythig很好,但是当达到链接时间时,命令行输出显示很多未定义的引用错误。 下面是使用CLI和它的输出:无法链接“.o”目标文件

arm-nobuos-linux-gnueabi-g++ -march=armv7-a -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/opt/nobu-x11/4.1.15-1.1.1/sysroots/cortexa9hf-vfp-neon-nobuos-linux-gnueabi -c -pipe -O2 -pipe -g -feliminate-unused-debug-types -g -DLINUX=1 -Wall -W -D_REENTRANT -fPIC -DQT_QML_DEBUG -DQT_CORE_LIB -I../qt_selexes_test2 -I. -isystem /opt/nobu-x11/4.1.15-1.1.1/sysroots/cortexa9hf-vfp-neon-nobuos-linux-gnueabi/usr/include -isystem /opt/nobu-x11/4.1.15-1.1.1/sysroots/cortexa9hf-vfp-neon-nobuos-linux-gnueabi/usr/include/qt5 -isystem /opt/nobu-x11/4.1.15-1.1.1/sysroots/cortexa9hf-vfp-neon-nobuos-linux-gnueabi/usr/include/qt5/QtCore -I. -I/opt/nobu-x11/4.1.15-1.1.1/sysroots/cortexa9hf-vfp-neon-nobuos-linux-gnueabi/usr/lib/qt5/mkspecs/linux-oe-g++ -o moc_mrs_flasher.o moc_mrs_flasher.cpp 
arm-nobuos-linux-gnueabi-g++ -march=armv7-a -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/opt/nobu-x11/4.1.15-1.1.1/sysroots/cortexa9hf-vfp-neon-nobuos-linux-gnueabi -Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed -o qt_selexes_test2 main.o dcan.o moc_dcan.o moc_mrs_flasher.o /SviluppoCodice/parodi/SW/updateAnalogCan_Wurth/qt_selexes_test2_20170511/qt_selexes_test2/mrs_flasher.o -lQt5Core -lpthread 
main.o: In function `main': 
main.cpp:26: undefined reference to `mrs_flasher::scan_module_wait(long, int, int, unsigned char&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)' 
main.cpp:37: undefined reference to `mrs_flasher::select_module(int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)' 
main.cpp:41: undefined reference to `mrs_flasher::download_s19_wait(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)' 

望着.o文件中似乎:

  • 编译器的目标机器是一样的(通过调用命令文件通过编译我的CPP文件和供应商提供的.o文件,它们都生成以下输出:“ELF 32位LSB可重新定位,ARM,EABI5版本1(SYSV),未去除

  • .o文件包含未定义的引用对象(我使用命令strings mrs_flasher.o |的grep为了搜索 “未定义参考`mrs_flasher :: scan_module_wait” scan_module_wait命令输出是:

scan_module_wait

_ZN11mrs_flasher16scan_module_waitEliiRhRSs

_ZN11mrs_flasher16scan_module_waitEliiRhRSs )

有没有人可以帮助我进一步调查此问题?有什么我可以发布以帮助解决问题? 谢谢乔瓦尼

回答

1

的解释是,对象文件您的供应商提供 - 我的猜测是/SviluppoCodice/parodi/SW/updateAnalogCan_Wurth/qt_selexes_test2_20170511/qt_selexes_test2/mrs_flasher.o - 没有与正在使用相同的编译器或与ABI兼容的编译器编译。

你可以看到这个的事实,你的编译器被发射到呼叫:

mrs_flasher::scan_module_wait(long, int, int, unsigned char&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&) 

,而你的目标文件定义了重整符号:

_ZN11mrs_flasher16scan_module_waitEliiRhRSs 

其中demangles为:

$ c++filt _ZN11mrs_flasher16scan_module_waitEliiRhRSs 
mrs_flasher::scan_module_wait(long, int, int, unsigned char&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&) 

请注意,您的编译器请求的函数具有第四个参数类型:

std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >& 

而由目标文件中定义了一个有不同类型的第四个参数:

std::basic_string<char, std::char_traits<char>, std::allocator<char> >& 

因此函数签名不匹配和链接器找到了没有定义的功能,您 编译调用。

两个函数签名的区别:

std::__cxx11::basic_string 

对:即内置编译器

std::basic_string 

告诉我们,你的编译器编译为C++11 ABI, 与GCC 5.1推出,但你的目标文件没有。

最有可能的原因是您的提供者使用GCC < 5.1构建了目标文件。除非你想建立自己的代码陈旧ABI,我以为你不这样做 - 这个对象 文件与您的编译器内置那些你无法链接。你应该让你的供应商提供一个新的,符合 的C++ 11 ABI。

+0

谢谢麦克,我会给一个尝试将旧ABI办法(为了验证供应商库)。 然后,我会问他用我的编译器重建的.o。 现在我已经明白如何在QTCreator使用旧的ABI – Giox79