2015-08-28 70 views
7

我無法讓CMake找到Linaro ARM工具鏈的線程(我嘗試了幾種不同的線程)。下面是我做了什麼:CMake無法找到Linaro工具鏈的線程

我創建了一個工具鏈,Linaro的-arm.cmake文件看起來像這樣:

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) 

我創建了一個小例子,項目用途線程:

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

我知道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 

它看起來像是仍然在尋找我的家鄉的libc,而不是交叉編譯環境:

/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:未找到版本「GLIBC_2.14」(由/ opt/gcc- Linaro的-4.9-2015.05-x86_64_ar M-Linux的gnueabihf //斌/臂-Linux的gnueabihf-GCC)

回答

1

問題的根本原因未在pthread庫:

的根本原因是:

/lib/x86_64-linux-gnu/libc.so.6:版本'GLIBC_2.14'找不到(需要/opt/gcc-linaro-4.9-2015.05-x86_64_arm-linux-gnueabihf//bin/arm-linux- gnueabihf-gcc)

您的編譯器正在嘗試向我們e您當地的libc

1)找到libc.so *在下載sysroot和檢查版本以下命令:

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

的,如果一切正常的使用這個LIB(與--sysroot選項);

您可以嘗試做手工:

/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。ç--sysroot /家庭/用戶/ SYSROOT/

2)你的工具鏈可能與不同的編譯版本libc.so比安裝在系統上,下載您的系統相應的版本,並使用它。

+0

看起來像是#2 - 這個工具鏈需要GLIBC 2.14,我在2.13上。我嘗試了較老的工具鏈,但我必須在那時沒有正確的工具鏈文件。 – zmb

+0

@zmb那麼,你的問題解決了嗎? 更好地將您的GLIBC升級到2.14 – Arseniy

+0

我最終使用了稍微老一點的工具鏈,因此我不必更新GLIBC,但是這樣可以解決問題。 – zmb