Linux libstdc&x2B+;。so:添加符号时出错:文件格式错误

Linux libstdc&x2B+;。so:添加符号时出错:文件格式错误,linux,cmake,cross-compiling,buildroot,Linux,Cmake,Cross Compiling,Buildroot,我正试图建立自己的图书馆。它在x86Linux上工作,所以我想为MIPSLinux(LittleEndian)构建 我正在使用曼托图形和CMake 我配置了build_all.sh如下所示 #!/bin/bash -ev export TARGETROOT="/usr/mipsel-buildroot-linux-gnu/sysroot" mkdir -p mips_build cd mips_build cmake -DCMAKE_SYSTEM_NAME="Linux" \ -D

我正试图建立自己的图书馆。它在x86Linux上工作,所以我想为MIPSLinux(LittleEndian)构建

我正在使用曼托图形和CMake

我配置了build_all.sh如下所示

#!/bin/bash -ev
export TARGETROOT="/usr/mipsel-buildroot-linux-gnu/sysroot"

mkdir -p mips_build
cd mips_build

cmake  -DCMAKE_SYSTEM_NAME="Linux" \
    -DCMAKE_C_COMPILER="${CROSS_COMPILE}gcc" \
    -DCMAKE_CXX_COMPILER="${CROSS_COMPILE}g++" \
    -DCMAKE_AR="${CROSS_COMPILE}ar" \
    -DCMAKE_C_FLAGS="-EL -c -g  -O2 -fPIC --sysroot=$TARGETROOT "  \
    -DCMAKE_CXX_FLAGS="-EL  -c -g  -O2 -fPIC --sysroot=$TARGETROOT " \
    ../

make

cd .. 
HOST_BINARY="$BUILDROOT/output/host/usr/bin"
PATH="${PATH}:${HOST_BINARY}" 
其中$CROSS\u COMPILE=/home/vagrant/bd1/mips-2014.05/bin/mips-linux-gnu-

cmakfiles.txt如下所示

make_minimum_required (VERSION 2.6)

set(EMSG_INCLUDE_DIR  ${CMAKE_CURRENT_SOURCE_DIR}/../../src/eagle_msg/include )
set(EMSG_LIB_DIR  ${CMAKE_CURRENT_SOURCE_DIR}/../../lib )

set (PROJECT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
set (PROJECT_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include)
set (PROJECT_LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib)


set(LIBRARIES  
    libemsg.a 
    libzmq.a  
    libprotobuf.a
    libprotobuf-c.a
    libpthread.a
    libstdc++.a
     )

#For controller : Client 
SET(EXECUTABLE test_controller)
project (${EXECUTABLE})
include_directories(
        ${PROJECT_INCLUDE_DIR}
        ${EMSG_INCLUDE_DIR}
        $ENV{TARGETROOT}/usr/include
)

link_directories( 
    ${PROJECT_LIB_DIR} 
    ${EMSG_LIB_DIR}
    $ENV{TARGETROOT}/usr/lib

)

set(SRCS 
    test_controller.cpp
)
add_executable( ${EXECUTABLE}  ${SRCS})
target_link_libraries( ${EXECUTABLE} ${LIBRARIES} )
[ 40%] Built target emsg
Linking CXX executable ../../../bin/test_controller
/usr/mipsel-buildroot-linux-gnu/sysroot/usr/lib/libstdc++.so: error adding symbols: File in wrong format
collect2: error: ld returned 1 exit status
make[2]: *** [../bin/test_controller] Error 1
make[1]: *** [test/emsg_test/CMakeFiles/test_controller.dir/all] Error 2
然后它会产生如下错误

make_minimum_required (VERSION 2.6)

set(EMSG_INCLUDE_DIR  ${CMAKE_CURRENT_SOURCE_DIR}/../../src/eagle_msg/include )
set(EMSG_LIB_DIR  ${CMAKE_CURRENT_SOURCE_DIR}/../../lib )

set (PROJECT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
set (PROJECT_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include)
set (PROJECT_LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib)


set(LIBRARIES  
    libemsg.a 
    libzmq.a  
    libprotobuf.a
    libprotobuf-c.a
    libpthread.a
    libstdc++.a
     )

#For controller : Client 
SET(EXECUTABLE test_controller)
project (${EXECUTABLE})
include_directories(
        ${PROJECT_INCLUDE_DIR}
        ${EMSG_INCLUDE_DIR}
        $ENV{TARGETROOT}/usr/include
)

link_directories( 
    ${PROJECT_LIB_DIR} 
    ${EMSG_LIB_DIR}
    $ENV{TARGETROOT}/usr/lib

)

set(SRCS 
    test_controller.cpp
)
add_executable( ${EXECUTABLE}  ${SRCS})
target_link_libraries( ${EXECUTABLE} ${LIBRARIES} )
[ 40%] Built target emsg
Linking CXX executable ../../../bin/test_controller
/usr/mipsel-buildroot-linux-gnu/sysroot/usr/lib/libstdc++.so: error adding symbols: File in wrong format
collect2: error: ld returned 1 exit status
make[2]: *** [../bin/test_controller] Error 1
make[1]: *** [test/emsg_test/CMakeFiles/test_controller.dir/all] Error 2
所以我检查了libstdc++的格式。然后是ELF 32位LSB共享对象,MIPS,MIPS32。这是正确的版本。那我该怎么解决呢

/usr/mipsel-buildroot-linux-gnu/sysroot# file /usr/mipsel-buildroot-linux-gnu/sysroot/usr/lib/libstdc++.* 
/usr/mipsel-buildroot-linux-gnu/sysroot/usr/lib/libstdc++.a:         current ar archive
/usr/mipsel-buildroot-linux-gnu/sysroot/usr/lib/libstdc++.so:        symbolic link to `libstdc++.so.6.0.19'
/usr/mipsel-buildroot-linux-gnu/sysroot/usr/lib/libstdc++.so.6:      symbolic link to `libstdc++.so.6.0.19'
/usr/mipsel-buildroot-linux-gnu/sysroot/usr/lib/libstdc++.so.6.0.19: ELF 32-bit LSB shared object, MIPS, MIPS32 rel2 version 1 (SYSV), dynamically linked, with unknown capability 0xf41 = 0x756e6700, not stripped
新信息 这似乎是buildroot的问题。我检查了mips linux gnu gcc的sysroot值

这是安装buildroot之前的结果

$ mips-linux-gnu-gcc --print-sysroot
/home/vagrant/bd1/mips-2014.05/bin/../mips-linux-gnu/libc
$ mips-linux-gnu-gcc --print-sysroot
/usr/usr/mipsel-buildroot-linux-gnu/sysroot/soft-float/el
这是安装buildroot后的结果

$ mips-linux-gnu-gcc --print-sysroot
/home/vagrant/bd1/mips-2014.05/bin/../mips-linux-gnu/libc
$ mips-linux-gnu-gcc --print-sysroot
/usr/usr/mipsel-buildroot-linux-gnu/sysroot/soft-float/el

我也发现了类似的问题。但这是老问题

我找到了原因。主要原因是sysroot路径。Buildroot将所有工具链组织到$Buildroot/output/host/中。因此,您应该更改路径环境,如下所示

#!/bin/bash -ev
export TARGETROOT="/usr/mipsel-buildroot-linux-gnu/sysroot"

mkdir -p mips_build
cd mips_build

cmake  -DCMAKE_SYSTEM_NAME="Linux" \
    -DCMAKE_C_COMPILER="${CROSS_COMPILE}gcc" \
    -DCMAKE_CXX_COMPILER="${CROSS_COMPILE}g++" \
    -DCMAKE_AR="${CROSS_COMPILE}ar" \
    -DCMAKE_C_FLAGS="-EL -c -g  -O2 -fPIC --sysroot=$TARGETROOT "  \
    -DCMAKE_CXX_FLAGS="-EL  -c -g  -O2 -fPIC --sysroot=$TARGETROOT " \
    ../

make

cd .. 
HOST_BINARY="$BUILDROOT/output/host/usr/bin"
PATH="${PATH}:${HOST_BINARY}" 
其中
$BUILDROOT
是提取BUILDROOT的文件夹


您应该使用下面的工具链
$BUILDROOT/output/host/usr/bin

请使用BUILDROOT提供的CMake工具链文件。它是在
$(HOST\u DIR)/usr/share/buildroot/toolchainfile.cmake
中生成的。这样使用它:

cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/host/usr/share/buildroot/toolchainfile.cmake

然后您可以删除所有其他-DCMAKE_uu变量,因为工具链文件向CMake指示要使用的编译器、标志等。

我找到了toolchainfile.CMake。我试过了,但没用。我的cmake版本是2.8.0。这似乎是Buildroot的脚本问题字符串子命令REPLACE至少需要四个参数。>调用堆栈(首先是最近的调用):>/usr/share/cmake-2.8/Modules/cmakeDeterminesSystem.cmake:86>(包括)请在Buildroot错误跟踪器中报告错误。toolchainfile.cmake应该可以工作,并且已经过多次测试。因此,请提交一份错误报告,详细说明重现问题的步骤。抱怨堆栈溢出将无法修复错误。