2015-08-28 9 views
7

Non riesco a ottenere CMake per trovare i thread con una toolchain ARM di Linaro (ne ho provati diversi). Ecco quello che ho fatto:CMake non trova i thread con la toolchain Linaro

ho creato un file ditoolchain-Linaro-arm.cmake che assomiglia a questo:

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) 

Ho creato un progetto di esempio minimo che usi thread:

~/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;} 

So che esistono le librerie pthread:

$ 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 

Sembra che qualcosa sta ancora guardando la mia libc nativa e non l'ambiente compilazione croce:

/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: versione "GLIBC_2.14" non trovata (richiesta da/opt/gcc- Linaro-4,9-2.015,05-x86_64_ar m-linux-gnueabihf // bin/braccio-linux-gnueabihf-gcc)

risposta

1

La causa principale del problema non nella libreria pthread:

La causa principale è:

/lib/x86_64-linux-gnu/libc.so.6: versione `GLIBC_2.14 'non trovata (richiesta da /opt/gcc-linaro-4.9-2015.05-x86_64_arm-linux-gnueabihf//bin/arm-linux- gnueabihf-gcc)

Il compilatore ci sta provando e il tuo locale libc.

1) Trovare libc.so * in scaricato sysroot e verificare la versione con il seguente comando:

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

Il se tutto è ok uso questo lib (con --sysroot opzioni);

Puoi provare a farlo manualmente:

/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 --sysroot/home/utente/sysroot/

2) Il tuo toolchain probabilmente compilate con differiscono libc.so versione di installato sul vostro sistema, scaricare la versione appropriata sul vostro sistema e utilizzarlo.

+0

Sembra che fosse # 2 - questa toolchain richiede GLIBC 2.14 e sono su 2.13. Ho provato i toolchain più vecchi ma a quel punto non avrei dovuto correggere il file toolchain. – zmb

+0

@zmb Quindi, il problema è risolto? Meglio aggiornare il GLIBC fino a 2.14 – Arseniy

+0

Ho finito per usare un toolchain leggermente più vecchio, quindi non devo aggiornare GLIBC, ma sì, questo risolve il problema. – zmb

Problemi correlati