歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Cmake 設置交叉編譯環境

我用的是合眾達的dm6446.

一  首先安裝CMAKE

下載cmake 然後解壓縮,進入解壓縮後的目錄,依次執行

# ./bootstrap
# make && make install

安裝過程需要幾分鐘。

二 構建交叉編譯的CMakeLists.txt

說明:

 

設置交叉編譯之前,必須在CMakeList.txt前面加上這樣一句,這樣CMake才會認為你是要交叉編譯:

SET(CMAKE_SYSTEM_NAME Linux)

 

在通知CMake要交叉編譯以後,還要告訴CMake到哪個路徑下去找庫文件,因為在交叉編譯的時候CMake是不會自動去系統默認的目錄找庫文件和頭文件的:

 

SET(CMAKE_FIND_ROOT_PATH "編譯器環境路徑")

SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)

SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)

SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

  其中的第一行,是告訴CMake查找的根目錄是什麼。後面分別是告訴CMake怎麼查找編譯時候的工具程序的位置、庫的位置和頭文件的位置。設置為NEVER表示不查找,設置為ONLY表示只在CMAKE_FIND_ROOT_PATH設定的目錄下查找,設置為BOTH(這是默認選項)表示既可以在系統目錄下查找,也可以在CMAKE_FIND_ROOT_PATH下查找。因為咱們是交叉編譯,所以後兩項的設置了ONLY,對於編譯時調用工具,一般來說是需要在系統目錄下查找的,不過我不需要所以設置為NEVER。

  然後,設置編譯器:

 

SET(CMAKE_C_COMPILER "編譯器環境路徑")

  直接把編譯器的路徑設置過去就可以了,CMAKE_C_COMPILER是C語言編譯器,CMAKE_CXX_COMPILE是C++語言編譯器。

 

所以 在工程主CMakeLists.txt 中首先加入如下:

SET(CMAKE_SYSTEM_NAME Linux)
SET(TOOLCHAIN_DIR "/opt/mv_pro_4.0/montavista/pro/devkit/arm/v5t_le")
SET(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR})
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_C_COMPILER ${TOOLCHAIN_DIR}/bin/arm_v5t_le-gcc)
SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/arm_v5t_le-g++)

三 生成可調試版本的程序

1使用CMAKE編譯確實很方便。但CMAKE默認編譯出來的程序不帶有符號文件,用GDB無法調試。

2 要編譯時產生符號文件供調試,調用CMAKE時,帶上 -DCMAKE_BUILD_TYPE=Debug

例如:在build文件中輸入:

cmake .. -DCMAKE_BUILD_TYPE=Debug

這樣產生的makefile文件make生成的可執行文件就帶有調試信息,供gdb和gdbserver使用了。

*****另外有另一種更好的方法是在工程主CMakeLists.txt中的PROJECT語句後加入一句

SET(CMAKE_BUILD_TYPE Debug)

CMake 中有一個變量 CMAKE_BUILD_TYPE ,可以的取值是 Debug Release RelWithDebInfo 和 MinSizeRel。當這個變量值為 Debug 的時候,CMake 會使用變量 CMAKE_CXX_FLAGS_DEBUG 和 CMAKE_C_FLAGS_DEBUG 中的字符串作為編譯選項生成 Makefile ,當這個變量值為 Release 的時候,工程會使用變量 CMAKE_CXX_FLAGS_RELEASE 和 CMAKE_C_FLAGS_RELEASE 選項生成 Makefile。

CMake 需要重點記住的命令和量

一  MESSAGE 命令

MESSAGE(STATUS "THIS IS A BINARY DIR" ${HELLO_BINARY_DIR})

STATUS 表示將要輸出前綴為“--”的信息,可以替換為

FATAL_ERROR:立即終止CMake過程

SEND_ERROR:產生錯誤,生成過程被跳過

二 IF 與ELSEIF 、ELSE、ENDIF

示例:

IF(表達式)

ELSEIF(表達式)

ELSE(表達式)

ENDIF

Copyright © Linux教程網 All Rights Reserved