我对我当前的C ++ Linux项目有疑问。 我正在构建源代码并将其链接(IDE是QtCreator)到供应商提供的.o(非.lib)文件。 在构建源文件时,似乎everythig很好,但是当我到达链接时,命令行输出表明许多未定义的引用错误。 这是使用过的cli及其输出:
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 scan_module_wait 以搜索 “对mrs_flasher :: scan_module_wait的未定义引用”命令输出为:
scan_module_wait
_ZN11mrs_flasher16scan_module_waitEliiRhRSs
_ZN11mrs_flasher16scan_module_waitEliiRhRSs )
是否有人可以帮助我进一步调查此问题?有什么东西可以发布,以帮助面对问题? 谢谢Giovanni
答案 0 :(得分: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
哪个消解为:
$ 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&lt; 5.1。您无法链接此对象 使用您的编译器构建的文件 - 除非您想要为过时的ABI构建自己的代码,我假设您没有。您应该让您的提供商提供符合的新提供商 C ++ 11 ABI。