A. cmake for mac怎麼用
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」系統是分開的,而且更為高階。
下載:
在安裝metis-5.0時,安裝說明中要求必須安裝CMake2.8版本,下面是CMake的安裝和使用方法,記錄下來以便以後學習。
在網址 http://www.cmake.org/ 下載你所需要的CMake源碼包cmake-2.8.8.tar..gz(版本不同,壓縮包後綴不同),分為Unix/linux版本 和 windows版本 。
1、安裝
有好幾種安裝CMake 的方法,因你所用的平台而異。
(1)從源碼安裝
Windows
在CMake 下載頁面 上有已編譯好的二進制包。它提供的是一個可執行的安裝程序。你還可以下載源碼包並從源碼包編譯CMake。CMake下載頁面還提供了已釋出的源碼和訪問CVS的指令。
為了從源碼樹編譯CMake,你必須先要安裝最新的CMake二進製版本,因為要用它來編譯源碼樹。一旦裝好了二進製版本的CMake,你就可以像編譯其他項目一樣使用CMake編譯CMake了。一般來說,這意思是你要選擇CMake源碼目錄作為源目錄,然後再指定編譯出來的可執行程序結果的位置。
Linux, Mac OSX, UNIX & Cygwin
在CMake 下載頁面 上有許多UNIX平台上已經編譯好的二進制包。
下面有幾種從源碼樹編譯CMake的方法:
解壓:tar xvf cmake-2.8.8.tar.gz
進入解壓目錄:cd cmake-2.8.8
進行如下操作:(選擇適合自己的操作步驟)
如果還沒有安裝CMake,源碼樹中提供了一個 bootstrap 腳本:
./bootstrap
make
make install
(註:make install 一步是可選的,CMake 可以在編譯目錄下運行。)
一個已經安裝了的CMake也可以用於編譯新版本的CMake:
cmake .
make
make install
(註:make install 一步是可選的,CMake 可以在編譯目錄下運行。)
在UNIX上,如果你不是使用的GNU C++編譯器,你要告訴bootstrap 腳本你想用哪個編譯器。這可以在運行configure命令前通過設置CC和CXX環境變數完成。例如,在一個帶有7.3X編譯器的SGI平台上,你可以像下面這樣編譯CMake:
(setenv CXX CC; setenv CC cc; ./bootstrap)
make
make install
要查看bootstrap腳本的詳細參數,請執行 ./bootstrap –help
(2)從二進制安裝
sudo apt-get install cmake
2、cmake 運行
(1)運行cmake with GUI
如果系統中有curses庫,cmake將生成一個可執行文件ccmake,它是一個基於文本程序的終端,有點類似windows GUI。
在源碼目錄中運行ccmake .,生成的二進制文件存放在源碼目錄下
當然也可以在其他目錄下運行ccmake,只是要指定你想編譯的源碼的路徑
ccmake的使用
當我們在源碼目錄下運行ccmake . 時,終端將顯示如下:
當我們鍵入c時,ccmake將編譯
當我們鍵入方向鍵時,可以選擇cache entry
當我們鍵入enter時,可以編輯cache entry
當我們鍵入g時,將生成Makefile,然後退出
當我們鍵入h時,將彈出幫助文檔
當我們鍵入q時,將退出ccmake
當我們鍵入t時,可以打開或關閉advanced cache entry
(2)運行cmake from the command line
如果源碼沒有太多的選項(在CMakeCache.txt文件中),可以只用cmake .來產生Makefile。
如果源碼選項太多,比如VTK,可以把參數-i傳遞給cmake,如:cmake -i .,
cmake將讓你為每一個cache file文件中的選項指定一個值,也能讓你增加新的選項到文件CMakeCache.txt中,或者使用ccmake,或者使用CMakeSetup。
當然,也可以傳遞設置選項的參數給cmake,如:
cmake -DVARIABLE:TYPE=VALUE .
3、 CMake cache
cmake第一次運行的時候,它將產生一個文件叫CMakeCache.txt,該文件可以被看作一個配置文件,它裡面的內容就像傳遞給configure命令的參數集,CMake GUI可以幫你很容易修改它,當然也可以直接對該文件做修改;如果你的CMakeLists.txt文件做過較大幅度的修改,你需要從cache中刪除相關的選項,如果你還沒有手動編輯過cache文件,在你重新運行cmake之前需刪除它。
4、 Cmake語法
(1)基本概念
cmake使用Cmake dfjs;dfasfLists.txt文件,該文件用include或者add_subdirectory命令來增加額外的輸入文件。
注釋行以#開頭到該行結尾
命令是由命令名,加括弧,括弧中的參數用空白隔開,它可以是內建的命令如add_library,或者用戶定義的宏或函數
所有的空格,包含空白符,空行,tabs,當然除了用來隔開參數的空白,都被忽略
B. 如何使用CMake進行交叉編譯
cmake交叉編譯配置
很多時候,我們在開發的時候是面對嵌入式平台,因此由於資源的限制需要用到相關的交叉編譯。即在你host宿主機上要生成target目標機的程序。裡面牽扯到相關頭文件的切換和編譯器的選擇以及環境變數的改變等,我今天僅僅簡單介紹下相關CMake在面對交叉編譯的時候,需要做的一些准備工作。
CMake給交叉編譯預留了一個很好的變數CMAKE_TOOLCHAIN_FILE,它定義了一個文件的路徑,這個文件即toolChain,裡面set了一系列你需要改變的變數和屬性,包括C_COMPILER,CXX_COMPILER,如果用Qt的話需要更改QT_QMAKE_EXECUTABLE以及如果用BOOST的話需要更改的BOOST_ROOT(具體查看相關Findxxx.cmake裡面指定的路徑)。CMake為了不讓用戶每次交叉編譯都要重新輸入這些命令,因此它帶來toolChain機制,簡而言之就是一個cmake腳本,內嵌了你需要改變以及需要set的所有交叉環境的設置。
toolChain腳本中設置的幾個重要變數
1.CMAKE_SYSTEM_NAME:
即你目標機target所在的操作系統名稱,比如ARM或者Linux你就需要寫"Linux",如果Windows平台你就寫"Windows",如果你的嵌入式平台沒有相關OS你即需要寫成"Generic",只有當CMAKE_SYSTEM_NAME這個變數被設置了,CMake才認為此時正在交叉編譯,它會額外設置一個變數CMAKE_CROSSCOMPILING為TRUE.
2. CMAKE_C_COMPILER:
顧名思義,即C語言編譯器,這里可以將變數設置成完整路徑或者文件名,設置成完整路徑有一個好處就是CMake會去這個路徑下去尋找編譯相關的其他工具比如linker,binutils等,如果你寫的文件名帶有arm-elf等等前綴,CMake會識別到並且去尋找相關的交叉編譯器。
3. CMAKE_CXX_COMPILER:
同上,此時代表的是C++編譯器。
4. CMAKE_FIND_ROOT_PATH:
指定了一個或者多個優先於其他搜索路徑的搜索路徑。比如你設置了/opt/arm/,所有的Find_xxx.cmake都會優先根據這個路徑下的/usr/lib,/lib等進行查找,然後才會去你自己的/usr/lib和/lib進行查找,如果你有一些庫是不被包含在/opt/arm裡面的,你也可以顯示指定多個值給CMAKE_FIND_ROOT_PATH,比如
set(CMAKE_FIND_ROOT_PATH /opt/arm /opt/inst)
該變數能夠有效地重新定位在給定位置下進行搜索的根路徑。該變數默認為空。當使用交叉編譯時,該變數十分有用:用該變數指向目標環境的根目錄,然後CMake將會在那裡查找。
5. CMAKE_FIND_ROOT_PATH_MODE_PROGRAM:
對FIND_PROGRAM()起作用,有三種取值,NEVER,ONLY,BOTH,第一個表示不在你CMAKE_FIND_ROOT_PATH下進行查找,第二個表示只在這個路徑下查找,第三個表示先查找這個路徑,再查找全局路徑,對於這個變數來說,一般都是調用宿主機的程序,所以一般都設置成NEVER
6. CMAKE_FIND_ROOT_PATH_MODE_LIBRARY:
對FIND_LIBRARY()起作用,表示在鏈接的時候的庫的相關選項,因此這里需要設置成ONLY來保證我們的庫是在交叉環境中找的.
7. CMAKE_FIND_ROOT_PATH_MODE_INCLUDE:
對FIND_PATH()和FIND_FILE()起作用,一般來說也是ONLY,如果你想改變,一般也是在相關的FIND命令中增加option來改變局部設置,有NO_CMAKE_FIND_ROOT_PATH,ONLY_CMAKE_FIND_ROOT_PATH,BOTH_CMAKE_FIND_ROOT_PATH
8. BOOST_ROOT:
對於需要boost庫的用戶來說,相關的boost庫路徑配置也需要設置,因此這里的路徑即ARM下的boost路徑,裡面有include和lib。
9. QT_QMAKE_EXECUTABLE:
對於Qt用戶來說,需要更改相關的qmake命令切換成嵌入式版本,因此這里需要指定成相應的qmake路徑(指定到qmake本身)
toolChain demo
# this is required
SET(CMAKE_SYSTEM_NAME Linux)
# specify the cross compiler
SET(CMAKE_C_COMPILER /opt/arm/usr/bin/ppc_74xx-gcc)
SET(CMAKE_CXX_COMPILER /opt/arm/usr/bin/ppc_74xx-g++)
# where is the target environment
SET(CMAKE_FIND_ROOT_PATH /opt/arm/ppc_74xx /home/rickk/arm_inst)
# search for programs in the build host directories (not necessary)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
# configure Boost and Qt
SET(QT_QMAKE_EXECUTABLE /opt/qt-embedded/qmake)
SET(BOOST_ROOT /opt/boost_arm)
這樣就完成了相關toolChain的編寫,之後,你可以靈活的選擇到底採用宿主機版本還是開發機版本,之間的區別僅僅是一條-DCMAKE_TOOLCHAIN_FILE=./toolChain.cmake,更爽的是,如果你有很多程序需要做轉移,但目標平台是同一個,你僅僅需要寫一份toolChain放在一個地方,就可以給所有工程使用。
C. 如何才能使CMake生成的可執行程序便於調試
出現的原因是導入的此makefile工程不是debug模式的,所以不包含調試信息,自然不能打斷點調試了。因此,要解決這個問題就要考慮如何修改CMakeLists.txt使其生成的makefile文件進而生成Debug模式下的帶調試信息的可執行程序;
我們先寫一個簡單的測試例子來測試一下,如何加調試信息:
假設文件結構如下:
./test6
|
+ ------ CmakeLists.txt
+ ------ main.cpp
+ ------ src_a
|
+ ------ CmakeLists.txt
+ ------ Testa.h
+ ------ Testa.cpp
+ ------ src_so
|
+ ------ CmakeLists.txt
+ ------ Testso.h
+ ------ Testso.cpp
第一步:test6目錄下CmakeLists.txt
cmake_minimum_required(VERSION 3.3)
project(main )
add_subdirectory(src_a ) // 給當前工程目錄添加子目錄 src_a
add_subdirectory(src_so ) // 給當前工程目錄添加子目錄 src_so
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") //添加調試信息
set(EXECUTABLE_OUTPUT_PATH $ {PROJECT_SOURCE_DIR}/bin) //設置可執行文件的生成路徑
include_directories($ {PROJECT_SOURCE_DIR}/src_a ${PROJECT_SOURCE_DIR}/src_so) //包含庫頭文件
aux_source_directory(. DIR_SRCS ) // 將當前目錄中的源文件名稱賦值給變數 DIR_SRCS
add_executable(main $ {DIR_SRCS}) //表示 DIR_SRCS中的源文件需要編譯成名為 main的可執行文件
target_link_libraries (main Testa Testso) //將庫文件鏈接到生成的目標可執行文件
第二步:子目錄目錄下CmakeLists.txt
1,src_a中靜態庫的編譯生成
cmake_minimum_required(VERSION 3.3) //該命令限定了 CMake 的版本
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") //添加調試信息
set(LIBRARY_OUTPUT_PATH $ {PROJECT_SOURCE_DIR}/bin) //設置Lib 靜態庫生成路徑
aux_source_directory(. LIBA_SRC) //將當前目錄中的源文件名稱賦值給變數 LIBA_SRC
add_library(Testad STATIC $ {LIBA_SRC}) //將變數 LIBA_SRC中的源文件編譯為靜態庫,庫文件名稱為 Testa
2,src_so中動態庫的編譯生成
cmake_minimum_required(VERSION 3.3) //該命令限定了 CMake 的版本
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") //添加調試信息
set(LIBRARY_OUTPUT_PATH $ {PROJECT_SOURCE_DIR}/bin) //設置Lib 動態庫庫生成路徑
aux_source_directory(. LIBSO_SRC) //將當前目錄中的源文件名稱賦值給變數 LIBA_SRC
add_library(Testsod SHARED $ {LIBSO_SRC}) //將變數 LIBA_SRC中的源文件編譯為動態庫,庫文件名稱為 Testso
此處執行cmake時有兩種方式:
1,在cmake的gui界面中設定生成Debug模式,
2,在執行cmake時使用如下命令:cmake -DCMAKE_BUILD_TYPE=Debug/Release path
關於ccmake的使用,這里簡單的做個說明:
1.首先在終端啟動cmake的gui界面:"ccmake ." 效果如圖:
2.然後在gui中輸入"c",效果如圖:
3.然後在gui中輸入"e",效果如圖:
4.此時在gui界面點擊"enter"回車鍵進行編輯:編輯完再次點擊回車退出編輯。
5.點擊"c",之後再次點擊"g"。此時makefile文件已經生成好了。make之後生成的可執行文件是帶有調試信息的,就可用gdb進行調試了(導入Eclipse也可以進行打斷點調試)。
D. 如何使用CMAKE生成makefile文件
CMake是一個跨平台的安裝(編譯)工具,可以用簡單的語句來描述所有平台的安裝(編譯過程)。他能夠輸出各種各樣的makefile或者project文件,能測試編譯器所支持的C++特性。只是 CMake 的組態檔取名為 CmakeLists.txt。Cmake 並不直接建構出最終的軟體,而是產生標準的建構檔(如 linux 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然後再依一般的建構方式使用。
在 linux 平台下使用 CMake 生成 Makefile 並編譯的流程如下:
編寫 CmakeLists.txt。
執行命令 「cmake PATH」 或者 「ccmake PATH」 生成 Makefile ( PATH 是 CMakeLists.txt 所在的目錄 )。
使用 make 命令進行編譯
工程實例:
一. 編寫各層CMakeLists.txt
主目錄的主程序main.cpp
#include "hello.h"
extern Hello hello;
int main()
{
hello.Print();
return 0;
}
主目錄的CMakeLists.txt
# to the root binary directory of the project as ${MAIN_BINARY_DIR}.
project (MAIN)
#version support
cmake_minimum_required(VERSION 2.8)
# Recurse into the "Hello" and "Demo" subdirectories. This does not actually
# cause another cmake executable to run. The same process will walk through
# the project's entire directory structure.
add_subdirectory (Hello)
add_subdirectory (Demo)
# Make sure the compiler can find include files from our Hello library.
include_directories (${MAIN_SOURCE_DIR}/Hello)
# Make sure the linker can find the Hello Demo library once it is built.
link_directories (${HELLO_BINARY_DIR}/Hello)
link_directories (${HELLO_BINARY_DIR}/Demo)
#define the source coedes of current directory as DIR_SRCS
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
# Add executable called "MAIN" that is built from the source files
add_executable (Main ${DIR_SRCS})
# Link the executable to the Hello Demo library.
target_link_libraries (Main Hello Demo)
E. 如何使用cmake生成基於靜態庫的動態鏈接庫
在工程搭建時,可能會有將靜態庫鏈接成動態庫的需求,如出於代碼保護的角度,某些模塊會發布.a擴展名的靜態庫,我們要將多個這樣的靜態庫鏈接成一個動態
庫。但與直接link目標文件不同的是,ld以默認參數執行時,並把靜態庫中沒有用到的函數過濾掉,導致生成的so並未包含所要的函數,因此要加上
--whole-archive參數,以保證所有的函數都包含在生成的so中。
在使用cmake時,CMakeLists.txt的寫法如下:
add_library(
${MODULE_NAME}
SHARED
${CMAKE_SOURCE_DIR}/builttime.c #要生成一個so,至少要包含一個源文件,實在沒有可以把庫的編譯時間戳打到這兒。
)
target_link_libraries(
${MODULE_NAME}
${${MODULE_NAME}_EXTRA_LDFLAGS}
"-Wl,--whole-archive" #告訴編譯器,從這里開始,所有的庫的內容都包含到so中
${LOCAL_MODULES} #可以是以源代碼生成的靜態庫
${PREBUILT_MODULES} #可以是預先生成的靜態庫
"-Wl,--no-whole-archive" #告訴編譯器,從這里開始,以後的庫的內容不用都包含到so中
)
F. linux cmakelist 怎麼用
由於調試需要因此研究了一下cmake這個誇平台的編譯工具的使用方法.
1.本人的機器為ubuntu 10.04,在連網的情況下直接在終端輸入:
[cpp] view plain 在CODE上查看代碼片派生到我的代碼片
root@zsh-linux:~#apt-get install cmake
安裝完畢之後可以在/var/cache/apt/archives看到安裝的.deb文件
或者在cmake官網下載cmake for linux
此時有個注意點是建議下載 cmake-2.8.4.tar.gz 而不是
cmake-2.8.4-Linux-i386.tar.gz
下載完成後解壓
[cpp] view plain 在CODE上查看代碼片派生到我的代碼片
root@zsh-linux:/opt#tar -zxvf cmake-2.8.4.tar.gz
然後 cd 到cmake-2.8.4目錄下
root@zsh-linux:/opt/cmake-2.8.4#
root@zsh-linux:/opt/cmake-2.8.4# ./bootstrap
root@zsh-linux:/opt/cmake-2.8.4# make
root@zsh-linux:/opt/cmake-2.8.4# make install
安裝完畢後查看是否安裝成功:
root@zsh-linux:/opt/cmake-2.8.4# cmake --version
cmake version 2.8.4
有以上信息表示安裝cmake成功。
2.cmake 的使用
(1)創建一個工程目錄文件夾,然後創建一個hello.c
[cpp] view plain 在CODE上查看代碼片派生到我的代碼片
#include<stdio.h>
int main()
{
printf(「hello,this is my first using cmake project/n」);
return 0;
}
(2)然後創建一個build目錄(用於編譯生成的相應文件),與hello.c目錄同級
(3)編寫CMakeLists.txt內容如下:(於hello.c目錄同級)
[cpp] view plain 在CODE上查看代碼片派生到我的代碼片
cmake_minimum_required(VERSION 2.8)
PROJECT(cmake_test)
SET(SRC_LIST main.c)
INCLUDE_DIRECTORIES(/usr/include/glib)
MESSAGE(STATUS "This is BINARY dir "${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})
(4)進入build目錄輸入 cmake ..
[cpp] view plain 在CODE上查看代碼片派生到我的代碼片
root@zsh-linux:/home/cmake_test/build# cmake ..
若編譯成功在build目錄下會生成相應文件,其中有個makefile文件
有可能會出現問題:
CMAKE_CXX_COMPILER-NOTFOUND" was not found
解決方法:
[cpp] view plain 在CODE上查看代碼片派生到我的代碼片
root@zsh-linux:/home/cmake_test/build# apt-get install g++
(可選)cmake -D CMAKE_CXX_COMPLIER=」g++」CMAKE -D CMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX:PATH=」/usr/local」
(5)輸入make 命令執行成功後在build目錄下會看到可執行的hello
(6)./hello
輸出 hello,this is my first usingcmake project。
註:這只適用於簡單的工程,若復雜的工程項目請參考www.cmake.org
G. 如何使用cmake編譯軟體項目3
1. 在主程序所在目錄的CMakeLists.txt中定義要編譯的主程序和輸出的可執行文件名:
#定義主程序名稱
add_executable(輸出的可執行文件名稱 源文件列表)
#定義鏈接庫
target_link_libraries(輸出的可執行文件名稱 鏈接庫1 鏈接庫2 ...)
2.在庫文件所在目錄中的CMakeLists.txt中告訴cmake將其所有庫文件編譯成動態庫:
#通過set命令自定義變數LIB_SRC包括那些源文件,這些文件將編譯到動態庫
set (LIB_SRC
libsrc1.cpp
libsrc2.cpp
libsrc3.cpp
)
#將上述文件編譯到庫中
add_library (庫名稱 SHARED ${LIB_SRC})
#定義庫的輸出位置, 如果在根目錄下的CMakeLists.txt中已經定義,此處可注釋掉。
set(LIBRARY_OUTPUT_PATH 具體的目錄位置)
H. cmake界面如何使用
看你是為了啥用這個了
cmake當然是要代碼的啊
CMake是一個跨平台的安裝(編譯)工具,可以用簡單的語句來描述所有平台的安裝(編譯過程)。他能夠輸出各種各樣的makefile或者project文件,能測試編譯器所支持的C++特性,類似UNIX下的automake。只是 CMake 的組態檔取名為 CmakeLists.txt。
CMake 可以編譯源代碼、製作程式庫、產生適配器(wrapper)、還可以用任意的順序建構執行檔。CMake 支持 in-place 建構(二進檔和源代碼在同一個目錄樹中)和 out-of-place 建構(二進檔在別的目錄里),因此可以很容易從同一個源代碼目錄樹中建構出多個二進檔。CMake 也支持靜態與動態程式庫的建構。
I. Cmake是什麼有什麼作用為什麼要使用Cmake
CMake是一個跨平台的安裝(編譯)工具,可以用簡單的語句來描述所有平台的安裝(編譯過程)。作用是他能夠輸出各種各樣的makefile或者project文件,能測試編譯器所支持的C++特性,類似UNIX下的automake。
只是 CMake 的組態檔取名為 CMakeLists.txt。Cmake 並不直接建構出最終的軟體,而是產生標準的建構檔(如 Unix 的 Makefile 或WindowsVisual C++的 projects/workspaces),然後再依一般的建構方式使用。
這使得熟悉某個集成開發環境(IDE)的開發者可以用標準的方式建構他的軟體,這種可以使用各平台的原生建構系統的能力是 CMake 和 SCons 等其他類似系統的區別之處。
CMake是為了解決美國國家醫學圖書館出資的Visible Human Project專案下的Insight Segmentation and Registration Toolkit (ITK) 軟體的跨平台建構的需求而創造出來的,其設計受到了Ken Martin開發的pcmaker所影響。pcmaker當初則是為了支持Visualization Toolkit這個開放源代碼的三維圖形和視覺系統才出現的,VTK也採用了CMake。
J. Cmake是什麼有什麼用在WINDOWS下如何用
CMake是一個比make更高級的編譯配置工具,它可以根據不同平台、不同的編譯器,生成相應的Makefile或者vcproj項目。 通過編寫CMakeLists.txt,可以控制生成的Makefile,從而控制編譯過程。CMake自動生成的Makefile不僅可以通過make命令構建項目生成目標文件,還支持安裝(make install)、測試安裝的程序是否能正確執行(make test,或者ctest)、生成當前平台的安裝包(make package)、生成源碼包(make package_source)、產生Dashboard顯示數據並上傳等高級功能,只要在CMakeLists.txt中簡單配置,就可以完成很多復雜的功能,包括寫測試用例。 如果有嵌套目錄,子目錄下可以有自己的CMakeLists.txt。 總之,CMake是一個非常強大的編譯自動配置工具,支持各種平台,KDE也是用它編譯的,感興趣的可以試用一下。 准備活動: (1)安裝cmake。 下載地址:中國至美.cmake.org/cmake/resources/software.html 根據自己的需要下載相應的包即可,Windows下可以下載zip壓縮的綠色版本,還可以下載源代碼。 Windows下CMake的使用 (2)運行cmake的方法。(GUI、命令行) 中國至美.cmake.org/cmake/help/runningcmake.html CMake使用步驟: 運行GUI的cmake界面: cmake-2.8.1-win32-x86\bin\cmake-gui.exe Windows下CMake的使用 執行Configure: 運行之後,生成了如下文件: Windows下CMake的使用 生成Makefile: 執行Generate之後生成如下文件: Windows下CMake的使用 運行make進行編譯: Windows下CMake的使用 編譯完成後,在build目錄生成Tutorial.exe,運行Tutorial.exe 25就可以看到運行結果: Windows下CMake的使用 運行make install安裝程序: Windows下CMake的使用 運行make test進行測試: Windows下CMake的使用 通過cmake tutorial學習CMake配置方法 中國至美.cmake.org/cmake/help/cmake_tutorial.html 可以在源代碼的Tests/Turorial目錄中找到這個手冊對應的代碼。 Windows下CMake的使用 1、Step1。 (如果不知道如何使用cmake,以及如何使用編譯產生的Turorial.exe,可先看下前面「CMake使用步驟」的說明,它以Step4為例詳細介紹了使用過程,Step1的配置可能不夠完全,比如無法運行make install,無法運行make test,但可以參考。) 簡單的程序編譯。 (1)運行GUI的cmake,指定要編譯的源代碼路徑和二進制文件路徑(會自動創建)。 Windows下CMake的使用 (2)點擊Configure,配置成功後,再點擊Generate。 配置需要選擇合適的編譯器,雖然我安裝了VC2008,但沒有配置成功;選擇Unix Makefiles,配置成功,它自動找到了DevC++下的gcc.exe等編譯器。 Windows下CMake的使用 (3)在build3目錄執行make,就能夠編譯生成Turorial.exe了。 D:\Projects\Lab\testngpp\cmake-2.8.1\Tests\Tutorial\Step1\build3>make Linking CXX executable Tutorial.exe [100%] Built target Tutorial 可以運行一下Turorial.exe: D:\Projects\Lab\testngpp\cmake-2.8.1\Tests\Tutorial\Step1\build3>Tutorial.exe Tutorial.exe Version 1.0 Usage: Tutorial.exe number D:\Projects\Lab\testngpp\cmake-2.8.1\Tests\Tutorial\Step1\build3>Tutorial.exe 4 The square root of 4 is 2 2、Step2 把子目錄編譯為庫,並且鏈接到最終的可執行文件。 include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions") add_subdirectory (MathFunctions) # 使得子目錄MathFunctions也能被編譯 # add the executable add_executable (Tutorial tutorial.cxx) target_link_libraries (Tutorial MathFunctions) 產生makefile: 在GUI上點擊Configure,之後Generate還是灰色,再次點擊Configure,Generate就可以點擊了。 編譯