无法链接“.o”目标文件
Unable linking a ".o" object file
我对我当前的 C++ Linux 项目有疑问。
我正在构建一个源代码并将其 linking(IDE 是 QtCreator)到供应商提供的 .o(不是 .lib)文件。
构建源文件时,似乎一切都很好,但是当我到达 link 时间时,命令行输出显示有很多未定义的引用错误。
这是使用的 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 为了搜索
"undefined reference to `mrs_flasher::scan_module_wait" 命令输出为:
scan_module_wait
_ZN11mrs_flasher16scan_module_waitEliiRhRSs
_ZN11mrs_flasher16scan_module_waitEliiRhRSs
)
有没有人可以帮我进一步调查这个问题?有什么我可以 post 来帮助解决问题的吗?
谢谢乔瓦尼
解释是您的供应商提供的目标文件-
我猜是 /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> >&
所以函数签名不匹配,linker 找不到你的函数的定义
编译器调用。
两个函数签名的区别:
std::__cxx11::basic_string
对比:
std::basic_string
告诉我们您的编译器编译为 C++11 ABI,
在 GCC 5.1 中引入,但构建目标文件的编译器没有。
最可能的原因是您的提供商使用 GCC < 5.1 构建了目标文件。你不能 link 这个对象
文件与用你的编译器构建的那些 - 除非你想为过时的 ABI 构建你自己的代码,我假设你不会这样做。你应该让你的提供者提供一个新的符合
C++11 ABI。
我对我当前的 C++ Linux 项目有疑问。 我正在构建一个源代码并将其 linking(IDE 是 QtCreator)到供应商提供的 .o(不是 .lib)文件。 构建源文件时,似乎一切都很好,但是当我到达 link 时间时,命令行输出显示有很多未定义的引用错误。 这是使用的 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 为了搜索 "undefined reference to `mrs_flasher::scan_module_wait" 命令输出为:
scan_module_wait
_ZN11mrs_flasher16scan_module_waitEliiRhRSs
_ZN11mrs_flasher16scan_module_waitEliiRhRSs )
有没有人可以帮我进一步调查这个问题?有什么我可以 post 来帮助解决问题的吗? 谢谢乔瓦尼
解释是您的供应商提供的目标文件-
我猜是 /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> >&
所以函数签名不匹配,linker 找不到你的函数的定义 编译器调用。
两个函数签名的区别:
std::__cxx11::basic_string
对比:
std::basic_string
告诉我们您的编译器编译为 C++11 ABI, 在 GCC 5.1 中引入,但构建目标文件的编译器没有。
最可能的原因是您的提供商使用 GCC < 5.1 构建了目标文件。你不能 link 这个对象 文件与用你的编译器构建的那些 - 除非你想为过时的 ABI 构建你自己的代码,我假设你不会这样做。你应该让你的提供者提供一个新的符合 C++11 ABI。