2015-10-16 391 views
1

我用boost和cmake編譯我的程序時遇到問題。我使用gcc-linaro-arm-linux-gnueabihf-4.9/bin/arm-linux-gnueabihf-g ++編譯器進行交叉編譯。 現在我有cmake的文件,如:C++ cmake&boost&arm交叉編譯

cmake_minimum_required (VERSION 2.6.2) 
project (xxx) 

SET(CMAKE_CXX_COMPILER /home/kamil/gcc-linaro-arm-linux-gnueabihf-4.9/bin/arm-linux-gnueabihf-g++) 
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread -Dtypeof=__typeof__ -D_GLIBCXX_USE_CXX11_ABI=0 -Wall -Werror -Wextra -Wno-error=array-bounds") 

if(DEFINED ENV{SDKTARGETSYSROOT}) 
    set(CMAKE_FIND_ROOT_PATH $ENV{SDKTARGETSYSROOT}) 
    set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) 
    set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) 
    set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) 
endif(DEFINED ENV{SDKTARGETSYSROOT}) 

find_package(Boost COMPONENTS system filesystem REQUIRED) 

include_directories("/usr/local/include") 
include_directories(${Boost_INCLUDE_DIRS}) 

enable_testing() 
set(CMAKE_CTEST_COMMAND ctest -V) 
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND}) 

add_subdirectory(src) 
add_subdirectory(test EXCLUDE_FROM_ALL) 

add_executable(xxxx 
    main.cpp 
    ...cpp 
    ...cpp 
    ...cpp 
    ...cpp 
) 

target_link_libraries(xxxx 
    ${Boost_SYSTEM_LIBRARY} 
    ${Boost_THREAD_LIBRARY} 
) 

install(TARGETS xxxx 
    DESTINATION bin 
    PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE 
    WORLD_READ WORLD_EXECUTE 
) 

現在當在Linux中使用命令(Ubuntu的):

  • cmake的..
  • 使

我有迴應:

[email protected]:~/test/build$ rm -rf * 
[email protected]:~/test/build$ cmake .. 
-- The C compiler identification is GNU 4.8.4 
-- The CXX compiler identification is GNU 4.8.4 
-- Check for working C compiler: /usr/bin/cc 
-- Check for working C compiler: /usr/bin/cc -- works 
-- Detecting C compiler ABI info 
-- Detecting C compiler ABI info - done 
-- Check for working CXX compiler: /usr/bin/c++ 
-- Check for working CXX compiler: /usr/bin/c++ -- works 
-- Detecting CXX compiler ABI info 
-- Detecting CXX compiler ABI info - done 
-- Boost version: 1.55.0 
-- Found the following Boost libraries: 
-- system 
-- filesystem 
-- Found GTest: /usr/local/lib/libgtest.so 
-- Configuring done 
-- Generating done 
-- Build files have been written to: /home/kamil/test/build 
[email protected]:~/test/build$ make 
Scanning dependencies of target xxxx 
[ 12%] Building CXX object src/CMakeFiles/test.dir/main.cpp.o 
In file included from /home/test/src/test/utils/logger.hpp:4:0, 
       from /home/kamil/test/src/main.cpp:9: 
/home/kamil/test/src/test/utils/singleton.hpp:5:33: fatal error: boost/noncopyable.hpp: No such file or directory 
#include <boost/noncopyable.hpp> 
           ^
compilation terminated. 
make[2]: *** [src/CMakeFiles/test.dir/main.cpp.o] Error 1 
make[1]: *** [src/CMakeFiles/test.dir/all] Error 2 
make: *** [all] Error 2 

錯誤:

fatal error: boost/noncopyable.hpp: No such file or directory 
    #include <boost/noncopyable.hpp> 

當我在cmake的下一行註釋:

SET(CMAKE_CXX_COMPILER /home/kamil/toradex/gcc-linaro-arm-linux-gnueabihf-4.9/bin/arm-linux-gnueabihf-g++) 

則一切正常。

我在Ubuntu安裝升壓用命令:sudo apt-get install libboost1.55-all-dev

什麼是錯的Linux-gnueabihf-g ++以及如何解決它編譯。

+0

當進行交叉編譯時,您需要爲目標機**構建所有庫,而不是主機(您在其上構建項目)構建**。此外,在CMake交叉編譯通常意味着使用[工具鏈文件](https://cmake.org/cmake/help/v3.0/manual/cmake-toolchains.7.html),它不僅設置編譯器,而且還設置目標架構,圖書館路徑等。 – Tsyvarev

+0

儘管Tsyarev是正確的,但通常情況下,您需要編譯目標平臺的依賴關係,但您可能不需要使用Boost。很多Boost的功能是「僅頭」,因此,您可能不必使用linaro工具鏈實際構建boost。如果通過調用「make VERBOSE = 1」運行make,輸出是什麼?你應該看到頭文件路徑來通過-I標誌傳遞給編譯器。它看起來不是正確的。 – brewbuck

+0

你有權利。使用「make VERBOSE = 1」我沒有看到-I標誌着升級文件的路徑。那麼我應該使用linaro工具鏈來增強提升嗎?像這樣:http://www.cnx-software.com/2011/10/03/cross-compiling-boost-c-libraries-for-arm/?然後一切都會好起來的?還有什麼我該做的? – kamil4u

回答