libstdc++.also: Fehler beim hinzufügen des symbols: File in wrong format
Ich versuche zu bauen, meine eigene Bibliothek. Es funktionierte auf x86-linux-so will ich bauen, für MIPS-Linux (Little endian.)
Ich bin mit sourcery codebench in Mento-Grafiken und buildroot und CMake.
Ich konfiguriert build_all.sh wie unten.
#!/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 ..
Wo $CROSS_COMPILE=/home/vagrant/bd1/mips-2014.05/bin/mips-linux-gnu-
Und CMakeFiles.txt ist wie unten.
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} )
Dann macht es den Fehler wie unten.
[ 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
So, ich habe das format von libstdc++.so. Dann ist es ELF 32-bit LSB shared object, MIPS, MIPS32. Das ist die richtige version. Dann was kann ich tun, um zu lösen?
/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
Neue Informationen
Scheint es das problem von buildroot. Ich habe das sysroot-Wert von mips-linux-gnu-gcc.
Dies ist das Ergebnis vor der Installation von buildroot.
$ mips-linux-gnu-gcc --print-sysroot
/home/vagrant/bd1/mips-2014.05/bin/../mips-linux-gnu/libc
Dies ist das Ergebnis nach der Installation von buildroot.
$ mips-linux-gnu-gcc --print-sysroot
/usr/usr/mipsel-buildroot-linux-gnu/sysroot/soft-float/el
Fand ich auch die post über ähnliche problem. Aber es ist alte Problem.
InformationsquelleAutor Jinho Yoo | 2015-01-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich den Grund gefunden. Der Hauptgrund ist die sysroot Weg. Buildroot organisiert alle toolchain zu $BUILDROOT/output/host/. So ändern Sie den PFAD wie unten.
Wobei $BUILDROOTis den Ordner, in dem buildroot entpackt wird.
Sollten Sie verwenden toolchain unter $BUILDROOT/output/host/usr/bin.
InformationsquelleAutor Jinho Yoo
Benutzen Sie bitte den CMake-toolchain-Datei zur Verfügung gestellt von Buildroot. Es wird generiert in
$(HOST_DIR)/usr/share/buildroot/toolchainfile.cmake
. Diese Art der Nutzung:Dann können Sie entfernen Sie alle Ihre anderen -DCMAKE_ variable, da die toolchain-Datei gibt an, zu CMake, die compiler verwenden, werden die flags, etc.
Bitte melden Sie einen bug in der Buildroot bug-tracker. Die toolchainfile.cmake sollte funktionieren, getestet wurde auch schon mehrmals. So berichten Sie bitte den bug mit den detaillierten Schritte zum reproduzieren des Problems. Klagen auf Stack Overflow wird nicht den Fehler behoben.
InformationsquelleAutor Thomas Petazzoni