CMake是一個跨平台的安裝(編譯)工具,可以用簡單的語句來描述所有平台的安裝(編譯過程)。他能夠輸出各種各樣的makefile或者project文件,能測試編譯器所支持的C++特性,類似UNIX下的automake。只是 CMake 的組態檔取名為 CmakeLists.txt。Cmake 並不直接建構出最終的軟件,而是產生標准的建構檔(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建構方式使用。這使得熟悉某個集成開發環境(IDE)的開發者可以用標准的方式建構他的軟件,這種可以使用各平台的原生建構系統的能力是 CMake 和 SCons 等其他類似系統的區別之處。
CMake 可以編譯源代碼、制作程式庫、產生適配器(wrapper)、還可以用任意的順序建構執行檔。CMake 支援 in-place 建構(二進檔和源代碼在同一個目錄樹中)和 out-of-place 建構(二進檔在別的目錄里),因此可以很容易從同一個源代碼目錄樹中建構出多個二進檔。CMake 也支援靜態與動態程式庫的建構。
“CMake”這個名字是“cross platform make”的縮寫。雖然名字中含有“make”,但是CMake和Unix上常見的“make”系統是分開的,而且更為高階。
[cmake 命令]
cmake .
make
make clean
重新編譯,需要刪除cmake的遺留文件
推薦編寫shell腳本處理這點簡單但是將會伴隨着你無數次的事情
[clear cmake file shell]
echo "rm cmake cache begin..."
rm ./cmake_install.cmake
rm -r ./CMakeFiles
rm ./Makefile
rm ./CMakeCache.txt
echo "rm cmake cache end..."
[內部編譯]
//CMakeLists.txt文件內容如下:
PROJECT (HELLO) //工程名HELLO
SET(SRC_LIST main.c) //顯示定義變量,並賦值
MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})
PROJECT指令的語法是:
PROJECT(projectname [CXX] [C] [Java])
SET(SRC_LIST main.c),如果有多個源文件,也可以定義成:SET(SRC_LIST main.c t1.c t2.c)。
MESSAGE指令的語法是:
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"
...)
這個指令用於向終端輸出用戶定義的信息,包含了三種類型:
SEND_ERROR,產生錯誤,生成過程被跳過。
SATUS,輸出前綴為—的信息。
FATAL_ERROR,立即終止所有cmake過程.
HELLO_BINARY_DIR和HELLO_SOURCE_DIR是兩個隱式變量
make clean即可對構建結果進行清理
[外部編譯]
構建
1,為工程添加一個子目錄src,用來放置工程源代碼;
2,添加一個子目錄doc,用來放置這個工程的文檔hello.txt
3,在工程目錄添加文本文件COPYRIGHT, README;
4,在工程目錄添加一個runhello.sh腳本,用來調用hello二進制
4,將構建后的目標文件放入構建目錄的bin子目錄;
5,最終安裝這些文件:將hello二進制與runhello.sh安裝至/usr/bin,將doc目錄的內容以及
COPYRIGHT/README安裝到/usr/share/doc/cmake/t2
ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})就可以構建一個libhello_static.a的靜態庫了。
[CMakeList 例子]
PROJECT(PRONAME) //工程名
SET(CMAKE_C_COMPILER "g++") //選擇編譯器,默認是gcc
AUX_SOURCE_DIRECTORY(./ SRC_LIST) //添加源碼目錄
SET(EXECUTABLE_OUTPUT_PATH ../bin) //添加bin文件生成路徑
ADD_DEFINITIONS(-g -W -Wall -DTIXML_USE_STL)
//ADD_DEFINITIONS添加一些宏,根據自己的程序需要
//添加頭文件路徑
INCLUDE_DIRECTORIES(
./
/home/hfx/src
)
//添加鏈接庫路徑
LINK_DIRECTORIES(
/usr/local/mysql/lib/mysql
)
//生成二進制文件
ADD_EXECUTABLE(helloworld ${SRC_LIST})
//生成LIB
ADD_LIBRARY(helloworld2 ${SRC_LIST})
//鏈接庫
TARGET_LINK_LIBRARIES(mysqlclient_r)
//代碼位置無關宏 -fPIC
位置無關代碼段的優點:
1.簡化設計,方便實現系統的快速引導。位置無關代碼可以避免在引導時進行地址映射,並方便地跳轉到RAM中實現快速引導
2.實現復位處理智能化。位置無關的代碼可以被加載到任意地址空間運行
3.便於調試。Bootloader的調試通常也是一個繁瑣的過程,使用位置無關代碼,則可以將映像文件加載到RAM中進行調試,
這既能真實地反映程序從ROM中 進行系統引導的情況,又可以避免頻繁燒寫程序存儲器。