CMake基本操作

CMakeLists.txt的語法比較簡單,由命令、註釋和空格組成,其中命令是不區分大小寫的,參數和變量是大小寫相關的,但,推薦全部使用大寫指令。符號”#”後面的內容被認爲是註釋。命令由命令名稱、小括號和參數組成,參數之間使用空格或分號進行間隔。變量使用${xxx}引用。常用cmakelists.txt文件構建cmake。如果工程存在多個目錄,需要確保每個要管理的目錄都存在一個CMakeLists.txt文件,這是CMake的構建定義文件。
一、linux下的安裝和查看
1、安裝軟件

sudo apt-get install cmake

2、安裝完成,查看版本

cmake --version

若出現對應的版本信息,則說明安裝成功

二、語法
1、常用命令:
aux_source_directory(<dir> <variable>)
該命令會把參數dir中所有的源文件(不包括頭文件)名稱賦值給參數variable;
find_path(<VAR> name1[path1 path2 …])
該命令在參數path*指示的目錄中查找文件name1並將查找到的路徑保存在變量VAR中(其中使用”[…]”包含的項表示可忽略項,使用”…|…”分割的項表示只能選擇其中一項);
find_library(${var} NAMES name1[name2 …] PATHS path1 [path2 …] PATH_SUFFIXES suffix1 [uffix2 …])
搜索一個外部的鏈接庫文件,並將結果的全部路徑保存到var變量中。要搜索的鏈接庫文件名字可能是name1,name2等;搜索路徑爲path1, path2等;此外還可以指定路徑的後綴詞爲suffix1,suffix2等;
find_package(name)
在指定的模塊目錄中搜索一個名爲Find.cmake(例如,FindOSG.cmake)的CMake腳本模塊文件,執行其中的內容,意圖搜索到指定的外部依賴庫頭文件和庫文件位置;
find_program
搜索一個外部的可執行程序;
project(name)
指定項目名稱name;
include(file)
在當前文件中包含另一個CMake腳本文件的內容,用來載入CMakeLists.txt文件,也用於載入預定義的cmake模塊;
include_directories
指定頭文件的搜索路徑,用來向工程添加多個特定的頭文件搜索路徑,可以多次調用以設置多個路徑,相當於指定gcc的-I參數;
link_directories
添加非標準的共享庫搜索路徑,設置外部動態鏈接庫或靜態鏈接庫的搜素路徑,相當於gcc的-L參數;
link_libraries
添加鏈接庫;
add_subdirectory
用於向當前工程添加存放源文件的子目錄,並可以指定中間二進制和目標二進制文件存放的位置;
add_executable
編譯可執行程序,指定編譯,好像也可以添加.o文件;
add_definitions(-DMACRO1-DMACRO2 …)
添加編譯參數,添加-D預編譯宏定義,可以一次添加多個;
add_dependencies
定義target依賴的其它target,確保在編譯本target之前,其它的target已經被構建;
add_library
可以設置要生成的鏈接庫爲SHARED或者STATIC,還可以設置MODULE(插件,可動態調用,但不作爲其它工程的依賴);
add_custom_target(name COMMANDcmd1 [COMMAND cmd2 ..])
添加一個名爲name的編譯目錄,並指定一個或多個自定義的命令cmd1,cmd2等;注意ADD_CUSTOM_COMMAND與這個命令的區別:前者是針對一個已有的子工程進行自定義編譯規則的設置;後者則是建立一個新的自定義的目標工程;
target_link_libraries
可以用來爲target添加需要鏈接的共享庫,指定工程所用的依賴庫,添加鏈接庫,添加動態庫或靜態庫,相當於指定-l參數;
message
打印消息,在控制檯或者對話框輸出一行或多行調試信息;
set
定義一個用戶自定義變量;
set_target_properties
用來設置輸出的名稱,對於動態庫,還可以用來指定動態庫版本和API版本;
cmake_minimum_required
設定依賴的cmake版本;
configure_file(infile outfile)
將文件infile複製到outfile的位置,同時執行其中變量的自動配置和更替;
install
安裝目標工程到指定的文件夾,此命令用於定義安裝規則,安裝的內容可以包括目標二進制、動態庫、靜態庫以及文件、目錄、腳本等;
option(${var} “text” value)
向用戶提供一個可選項,提示信息爲text,初始值爲value,並將最終的結果傳遞到var變量中;
enable_testing
用來控制Makefile是否構建test目標,涉及工程所有目錄;
exec_program
用於在指定的目錄運行某個程序;
execute_process
執行一個或多個子進程,按指定的先後順序運行一個或多個命令;
file
文件操作命令;
2、內置變量和環境變量
CMAKE_C_COMPILER
指定C編譯器;
CMAKE_CXX_COMPILER
指定C++編譯器;
CMAKE_C_FLAGS
指定編譯C文件時的編譯選項,如-g,也可以通過add_definitions添加編譯選項;
CMAKE_CXX_FLAGS
設置C++編譯選項;
CMAKE_BUILD_TYPE
build類型(Debug,Release,…),CMAKE_BUILD_TYPE=Debug;
CMAKE_COMMAND
CMake可執行文件本身的全路徑;
CMAKE_DEBUG_POSTFIX
Debug版本生成目標的後綴,通常可以設置爲”d”字符;
CMAKE_GENERATOR
編譯器名稱,例如”UnixMakefiles”, “Visual Studio 7”等;
CMAKE_INSTALL_PREFIX
工程安裝目錄,所有生成和調用所需的可執行程序,庫文件,頭文件都會安裝到該路徑下,Unix/Linux下默認爲/usr/local, windows下默認爲C:\Program Files;
CMAKE_MODULE_PATH
設置搜索CMakeModules模塊(.cmake)的額外路徑,用來定義自己的cmake模塊所在的路徑;
CMAKE_CURRENT_SOURCE_DIR
指的是當前處理的CMakeLists.txt所在的路徑;
CMAKE_CURRENT_BINARY_DIR
如果是in-source編譯,則跟CMAKE_CURRENT_SOURCE_DIR一致;如果是out-of-source,指的是target編譯目錄;
CMAKE_CURRENT_LIST_FILE
輸出調用這個變量的CMakeLists.txt的完整路徑;
CMAKE_CURRENT_LIST_LINE
輸出這個變量所在的行;
CMAKE_INCLUDE_CURRENT_DIR
自動添加CMAKE_CURRENT_BINARY_DIR和CMAKE_CURRENT_SOURCE_DIR到當前處理的CMakeLists.txt;
CMAKE_INCLUDE_DIRECTORIES_PROJECT_EFORE
將工程提供的頭文件目錄始終至於系統頭文件目錄的前面,當你定義的頭文件確定跟系統發生衝突時可以提供一些幫助;
EXECUTABLE_OUTPUT_PATH
指定可執行文件的存放路徑,最終結果的存放目錄;
LIBRARY_OUTPUT_PATH
指定庫文件存放路徑,最終結果的存放目錄;
BUILD_SHARED_LIBS
指定編譯成靜態庫還是動態庫;
PROJECT_BINARY_DIR(CMAKE_BINARY_DIR)
如果是內部構建(in-sourcebuild),指的就是工程頂層目錄;如果是外部構建(out-of-source build),指的是工程編譯發生的目錄;
PROJECT_NAME
工程名稱,即使用PROJECT命令設置的名稱;
PROJECT_SOURCE_DIR(CMAKE_SOURCE_DIR)
工程源代碼文件所在的目錄,指的是工程頂層目錄;
CYGWIN
標識當前系統是否爲Cygwin;
MSVC
標識當前系統是否使用MicrosoftVisual C;
UNIX
標識當前系統是否爲Unix系列(包括Linux、Cygwin和Apple);
WIN32
標識當前系統是否爲Windows及Win64;
3、語法
①#註釋
②條件語句:

 if(var) 
          …
    else()/elseif() 
    	… 
    endif(var)

③循環語句

Set(VAR a b c)
Foreach(f ${VAR})       …Endforeach(f)

④循環語句

   WHILE() … ENDWHILE()

三、基本實例
1、簡單例程
目錄TEST1,只有一個main.c、CMakeLists.txt文件,目錄基本如下
TEST1
main.c
CMakeLists.txt

其中

//  TEST1/main.c
#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("This is CMAKE_TEST1\n");
    return 0;
}
# TEST1/CMakeLists.txt
cmake_minimum_required(VERSION 2.8)  #最低要求版本爲2.8
PROJECT(TEST1)                                     #工程名稱,不必須實際目錄
add_executable(CMAKE_TEST1 main.c)   #make生成執行可執行程序名稱

執行cmake .(注意,後面有 ’ . ’ ,表示當前目錄),控制窗口出現如下:

-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done

出現如下文件

CMakeCache.txt  cmake_install.cmake  main.c
CMakeFiles      CMakeLists.txt       Makefile

輸入make,執行Makefile生成可執行程序,如下所示

CMakeCache.txt  cmake_install.cmake  CMAKE_TEST1  Makefile
CMakeFiles      CMakeLists.txt       main.c

2、同一目錄,多個源文件
TEST2
main.c
Myadd.c
Myadd.h
CMakeLists.txt

//TEST2/main.c
#include <stdio.h>
#include <stdlib.h>
#include "Myadd.h"

int main()
{
    int a=10,b=20;
    int c=Myadd(a,b);
    printf("c=%d\n",c);
    printf("This is CMAKE_TEST2\n");
    return 0;
}
//TEST2/Myadd.c
#include "Myadd.h"

int Myadd(int a,int b)
{
    return (a+b);
}
//TEST2/Myadd.h
#include <stdio.h>
#include <stdlib.h>

int Myadd(int a,int b);
#TEST2/CMakeLists.txt
cmake_minimum_required(VERSION 2.8)  #最低要求版本爲2.8
PROJECT(TEST2)                        #工程名稱,不必須實際目錄
add_executable(CMAKE_TEST2 main.c Myadd.c)   #make生成執行可執行程序名稱

或者,也是可實現

CMakeLists.txt
cmake_minimum_required(VERSION 2.8)  #最低要求版本爲2.8
PROJECT(TEST2)                       #工程名稱,不必須實際目錄
aux_source_directory(. SRC)          #讀取當前文件下所有源文件
add_executable(CMAKE_TEST2_2 ${SRC})   #make生成執行可執行程序名稱

3、不同目錄,不同文件
TEST3
main.c
CMakeLists.txt
LIB
——Myadd.c
——Myadd.h
——CMakeLists.txt
不同的地方:

#TEST3/CMakeLists.txt
cmake_minimum_required(VERSION 2.8)  #最低要求版本爲2.8
PROJECT(TEST2)                                     #工程名稱,不必須實際目錄
aux_source_directory(. SRC)                     #讀取當前文件下所有源文件
add_subdirectory(LIB)                               #指向當前源文件的子目錄
include_directories(LIB)                            #指向當前的頭文件存放目錄
add_executable(CMAKE_TEST3 ${SRC})        #make生成執行可執行程序名稱
target_link_libraries(CMAKE_TEST3 Myadd)  #指向鏈目錄
#TEST3/LIB/CMakeLists.txt
aux_source_directory(. LIB_SOUR)
add_library(Myadd ${LIB_SOUR})

另一種方法,不需要LIB/CMakeLists.txt文件

#TEST3/CMakeLists.txt
cmake_minimum_required(VERSION 2.8)  #最低要求版本爲2.8
PROJECT(TEST2)                       #工程名稱,不必須實際目錄
aux_source_directory(. SRC)          #讀取當前文件下所有源文件
aux_source_directory(LIB SRC2)          #讀取當前文件下所有源文件
#add_subdirectory(LIB)                #指向當前源文件的子目錄
include_directories(LIB)             #指向當前的頭文件存放目錄
add_executable(CMAKE_TEST3 ${SRC} ${SRC2})   #make生成執行可執行程序名稱
#target_link_libraries(CMAKE_TEST3 Myadd)  #指向鏈目錄
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章