我用的是合眾達的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