2015-08-28 8 views
7

Ich kann CMake nicht finden, um Threads mit einer Linaro ARM Toolchain zu finden (ich habe mehrere verschiedene ausprobiert). Hier ist, was ich getan habe:CMake kann keine Threads mit Linaro Toolchain finden

Ich habe eine Toolchain-Linaro-arm.cmake-Datei, die wie folgt aussieht:

set (CMAKE_SYSTEM_NAME Linux)                   

include (CMakeForceCompiler)                    
set (TOOLCHAIN_BASE "/opt/gcc-linaro-4.9-2015.05-x86_64_arm-linux-gnueabihf/")       

set (CMAKE_SYSTEM_PROCESSOR armhf-cortexa9)                

CMAKE_FORCE_C_COMPILER("${TOOLCHAIN_BASE}/bin/arm-linux-gnueabihf-gcc" GNU)        
CMAKE_FORCE_CXX_COMPILER("${TOOLCHAIN_BASE}/bin/arm-linux-gnueabihf-g++" GNU)       

set (CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} /home/user/sysroot)         

set (CMAKE_SIZEOF_VOID_P 4)                    

set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)               
set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)                
set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)                
set (CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) 

ich ein minimales Beispielprojekt erstellt, die Anwendungen Themen:

~/threadstest $ ls 
CMakeLists.txt main.cpp 

~/threadstest $ cat CMakeLists.txt 
cmake_minimum_required(VERSION 3.0.0) 
project(threads_test) 
add_executable(test main.cpp) 
find_package(Threads REQUIRED) 
target_link_libraries(test, ${CMAKE_THREAD_LIBS_INIT}) 

~/threadstest $ cat main.cpp 
int main() { } 

~/threadstest $ mkdir build; cd build 

~/threadstest/build $ cmake -DCMAKE_TOOLCHAIN_FILE=~/Toolchain-Linaro-arm.cmake .. 
CMake Error at /opt/cmake-3.3.1-Linux-x86_64/share/cmake-3.3/Modules/FindPackageHandleStandardArgs.cmake:148 (message): 
    Could NOT find Threads (missing: Threads_FOUND) 
Call Stack (most recent call first): 
    /opt/cmake-3.3.1-Linux-x86_64/share/cmake-3.3/Modules/FindPackageHandleStandardArgs.cmake:388 (_FPHSA_FAILURE_MESSAGE) 
    /opt/cmake-3.3.1-Linux-x86_64/share/cmake-3.3/Modules/FindThreads.cmake:205 (FIND_PACKAGE_HANDLE_STANDARD_ARGS) 
    CMakeLists.txt:8 (find_package) 

~/threadstest/build $ cat CMakeFiles/CMakeError.log 

Determining if files pthread.h exist failed with the following output: 
Change Dir: /home/user/threadstest/arm/CMakeFiles/CMakeTmp 

Run Build Command:"/usr/bin/make" "cmTC_37a3c/fast" 
/usr/bin/make -f CMakeFiles/cmTC_37a3c.dir/build.make CMakeFiles/cmTC_37a3c.dir/build 
make[1]: Entering directory `/home/user/threadstest/arm/CMakeFiles/CMakeTmp' 
Building C object CMakeFiles/cmTC_37a3c.dir/CheckIncludeFiles.c.o 
/opt/gcc-linaro-4.9-2015.05-x86_64_arm-linux-gnueabihf//bin/arm-linux-gnueabihf-gcc -o CMakeFiles/cmTC_37a3c.dir/CheckIncludeFiles.c.o -c /home/user/threadstest/arm/CMakeFiles/CMakeTmp/CheckIncludeFiles.c 
/opt/gcc-linaro-4.9-2015.05-x86_64_arm-linux-gnueabihf//bin/arm-linux-gnueabihf-gcc: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /opt/gcc-linaro-4.9-2015.05-x86_64_arm-linux-gnueabihf//bin/arm-linux-gnueabihf-gcc) 
make[1]: Leaving directory `/home/user/threadstest/arm/CMakeFiles/CMakeTmp' 
make[1]: *** [CMakeFiles/cmTC_37a3c.dir/CheckIncludeFiles.c.o] Error 1 
make: *** [cmTC_37a3c/fast] Error 2 

Source: 
/* */ 
#include <pthread.h> 


int main(void){return 0;} 

ich die pthread Bibliotheken kennen existieren:

$ find ~/sysroot -name "*pthread*" 
/home/user/sysroot/usr/lib/libpthread_nonshared.a 
/home/user/sysroot/usr/lib/libpthread.so.0 
/home/user/sysroot/usr/lib/libpthread-2.19-2014.08-1-git.so 
/home/user/sysroot/usr/lib/libpthread_p.a 
/home/user/sysroot/usr/lib/libpthread.a 
/home/user/sysroot/usr/lib/libpthread.so 
/home/user/sysroot/usr/include/bits/pthreadtypes.h 
/home/user/sysroot/usr/include/pthread.h 

Es sieht aus wie etwas noch in meiner Heimat libc und nicht das Kreuz kompilieren Umgebung suchen:

/opt/gcc-linaro-4.9-2015.05-x86_64_arm-linux-gnueabihf//bin/arm-linux-gnueabihf-gcc -o CMakeFiles/cmTC_37a3c.dir/CheckIncludeFiles.co -c /home/user/threadstest/arm/CMakeFiles/CMakeTmp/CheckIncludeFiles.c /opt/gcc-linaro-4.9-2015.05-x86_64_arm -linux-gnueabihf // bin/arm-linux- gnueabihf-gcc: /lib/x86_64-linux-gnu/libc.so.6: Version "GLIBC_2.14" nicht gefunden (erforderlich von/opt/gcc- linaro-4.9-2015.05-x86_64_ar m-Linux-gnueabihf // ist/Arm-Linux-gnueabihf-gcc)

Antwort

1

Die Ursache des Problems nicht in Pthread Bibliothek:

Die Ursache ist:

/lib/x86_64-linux-gnu/libc.so.6: Version `GLIBC_2.14 'nicht gefunden (erforderlich von /opt/gcc-linaro-4.9-2015.05-x86_64_arm-linux-gnueabihf//bin/arm-linux- gnueabihf-gcc)

Ihr Compiler versucht uns e Ihre lokale libc.

1) Finden Sie libc.so * in heruntergeladen sysroot und überprüfen Version mit folgendem Befehl:

objdump -p libc.so.6 | grep "Version References:" -A 10 

Die, wenn alles in Ordnung ist die Verwendung dieser lib (mit --sysroot Optionen);

Sie können versuchen, es manuell zu tun:

/opt/gcc-linaro-4.9-2015.05-x86_64_arm-linux-gnueabihf//bin/arm-linux-gnueabihf-gcc -o CMakeFiles/cmTC_37a3c .dir/CheckIncludeFiles.co -c/home/Benutzer/Threadtest/Arm/CMakeFiles/CMakeTmp/CheckIncludeFiles.c --sysroot/home/user/sysroot/

2) Ihre Werkzeugketten wahrscheinlich kompiliert mit unterscheiden libc.so Version als System installiert auf, laden Sie entsprechende Version auf Ihrem System und verwenden.

+0

Sieht so aus als wäre es # 2 - diese Toolchain benötigt GLIBC 2.14 und ich bin auf 2.13. Ich habe ältere Toolchains ausprobiert, aber ich musste die Toolchain-Datei zu diesem Zeitpunkt noch nicht korrekt haben. – zmb

+0

@zmb Also, ist dein Problem gelöst? Besser, dein GLIBC auf 2.14 zu verbessern – Arseniy

+0

Ich endete mit einer etwas älteren Werkzeugkette, also muss ich GLIBC nicht aktualisieren, aber ja löst das das Problem. – zmb