代码之家  ›  专栏  ›  技术社区  ›  Giox79

无法链接“.o”对象文件

  •  1
  • Giox79  · 技术社区  · 7 年前

    我对我目前的C++Linux项目有一个问题。 在构建源文件时,似乎一切都很好,但当我到达链接时间时,命令行输出指示许多未定义的引用错误。 以下是使用的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文件包含未定义的引用对象(我使用命令 串mrs_闪光器。o | grep scan_module_wait “对'mrs\u闪光器::scan\u module\u wait'的未定义引用” 命令输出为:

    _ZN11mrs\U闪光器16SCAN\U模块WAITELiIRSS

    有没有人可以帮我进一步调查这个问题?我可以发布一些东西来帮助解决这个问题吗? 谢谢Giovanni

    1 回复  |  直到 4 年前
        1
  •  1
  •   Mike Kinghan Luchian Grigore    7 年前

    原因是供应商提供的目标文件- /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引入,但构建对象文件的编译器没有。

    C++11 ABI。