2015-01-15 1492 views
1

我正尝试构建自己的库。它在x86 linux上工作,所以我想为MIPS Linux(Little Endian)构建。libstdC++。so:错误添加符号:错误格式的文件

我在Mento Graphics中使用sourcery codebench,在CMake中使用buildroot

我配置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 .. 

$ CROSS_COMPILE = /家庭/流浪者/ BD1/MIPS-2014.05 /斌/ MIPS-Linux的gnu-

而且CMakeFiles.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 

所以我检查了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 

这是安装buildroot后的结果。

$ mips-linux-gnu-gcc --print-sysroot 
/usr/usr/mipsel-buildroot-linux-gnu/sysroot/soft-float/el 

我还发现有关类似问题的post。但这是个老问题。

回答

2

我找到了原因。主要原因是sysroot路径。 Buildroot将所有工具链组织到$ BUILDROOT/output/host /中。所以你应该像下面那样改变PATH环境。

HOST_BINARY="$BUILDROOT/output/host/usr/bin" 
PATH="${PATH}:${HOST_BINARY}" 

其中$ BUILDROOT是提取buildroot的文件夹。

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

2

请使用Buildroot提供的CMake工具链文件。它在$(HOST_DIR)/usr/share/buildroot/toolchainfile.cmake中生成。使用这种方式:

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

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

+0

我发现toolchainfile.cmake。我测试了它,但没有奏效。我的cmake版本是2.8.0。这似乎是Buildroot脚本问题的问题。 ------------------------------- >字符串子命令REPLACE需要至少四个参数。 >调用堆栈(最近呼叫优先): > /usr/share/cmake-2.8/Modules/CMakeDetermineSystem.cmake:86 >(INCLUDE) – 2015-01-17 14:33:15

+0

请报告Buildroot错误跟踪器中的错误。 toolchainfile.cmake应该可以工作,并且已经被测试了几次。所以请提交一份错误报告,其中包含详细步骤来重现您的问题。抱怨堆栈溢出不会修正错误。 – 2015-01-27 12:56:41