2012-04-25 77 views
3

這裏是我的配置我的編譯器部分:交叉編譯時,我必須用C++庫做些什麼?

IF(UNIX) 
    ## Compiler flags 

    # specify the cross compiler 
    SET(CMAKE_C_COMPILER /home/username/projects/buildroot/output/host/usr/bin/arm-linux-gcc) 
    SET(CMAKE_CXX_COMPILER /home/username/projects/buildroot/output/host/usr/bin/arm-linux-g++) 

    if(CMAKE_COMPILER_IS_GNUCXX) 
     set(CMAKE_CXX_FLAGS "-O3") 
     set(CMAKE_EXE_LINKER_FLAGS "-lsqlite3 -lrt -lpthread") 
    endif() 

    target_link_libraries(complex 
     ${Boost_FILESYSTEM_LIBRARY} 
     ${Boost_SYSTEM_LIBRARY}) 
ENDIF(UNIX) 

有3個問題:-lsqlite3 -lrt -lpthread

如何,我必須讓他們爲我的架構,並指定在這裏?如何設置(使用set?)編譯後的庫的路徑,之後我將以某種方式重新編譯我的架構?

回答

6

如果你想用CMake進行交叉編譯,你應該使用一個工具鏈文件。有關介紹,請參閱CMake Wiki。爲了使用第三方庫(即不包含在交叉編譯工具鏈中),您也需要交叉編譯它們。

編輯:由於您使用的是buildroot工具鏈,因此您可以使用已包含的CMake工具鏈文件。調用CMake時只需傳入-DCMAKE_TOOLCHAIN_FILE=/home/username/projects/buildroot/output/toolchainfile.cmake。無需在您的CMakeLists.txt文件中設置CMAKE_C_COMPILERCMAKE_CXX_COMPILER。此外,設置CMAKE_CXX_FLAGSCMAKE_EXE_LINKER_FLAGS被認爲是非常糟糕的做法。

假設您在構建buildroot工具鏈時已經構建了sqlite3,因此您可以像使用其他庫一樣使用它。即:

find_path(SQLITE3_INCLUDE_DIR sqlite3.h) 
find_library(SQLITE3_LIBRARY sqlite3) 
if(NOT SQLITE3_INCLUDE_DIR) 
    message(SEND_ERROR "Failed to find sqlite3.h") 
endif() 
if(NOT SQLITE3_LIBRARY) 
    message(SEND_ERROR "Failed to find the sqlite3 library") 
endif() 

find_package(Threads REQUIRED) 

# ... 

target_link_libraries(complex 
    ${Boost_FILESYSTEM_LIBRARY} 
    ${Boost_SYSTEM_LIBRARY} 
    ${SQLITE3_LIBRARY} 
    ${CMAKE_THREAD_LIBS_INIT} 
    rt) 

最後,不要設置CMAKE_CXX_FLAGS-O3。相反,用戶在配置項目時應該通過-DCMAKE_BUILD_TYPE=Release

+0

我正在使用buildroot工具鏈 – Cynede 2012-04-25 12:11:07

+0

非常感謝您的編輯* – Cynede 2012-04-27 09:33:06

+0

很高興它幫助您解決了您的問題。 – 2012-04-27 09:36:49

2

您還必須交叉編譯依賴關係。路徑取決於你安裝它們的位置。

Btw。,使用-lpthread不是獲取POSIX線程的安全方式。你應該給編譯器和鏈接器提供選項-pthread