CMakeLists.txt編寫常用命令


注:本文主要引用自https://www.cnblogs.com/hbccdf/p/introduction_of_cmake.html

1. 設置cmake最小版本

cmake_minimum_required (VERSION 2.8)

2. 設置項目名稱

project(demo)

3. 設置編譯目標類型

  • add_executable:生成可執行文件
  • add_library:生成庫文件

add_library默認生成靜態庫,可以顯示指定生成庫的類型:

#靜態庫
add_library(test STATIC test.cpp)

#動態庫
add_library(test SHARED test.cpp)

windows下生成的可執行文件是*.exe, 靜態庫是*.lib,動態庫是*.lib*.dll都有,但是*.lib文件很小,只是指向*.dll文件,相當於Linux下的軟連接。

Linux下的可執行程序沒有后綴名,靜態庫是lib*.a文件,動態庫是lib*.so文件。

4. 指定編譯包含的源文件

1. 明確指明包含的源文件

add_executable(demo main.cpp test.cpp util.cpp)

2. 搜索指定目錄的所有的cpp文件

aux_source_directory(. SRC_LIST) #搜索當前目錄下的所有.cpp文件
add_executable(demo ${SRC_LIST})

3. 自定義搜索規則

file(GLOB SRC_LIST "*.cpp" "*.cc")
add_executable(demo ${SRC_LIST})

GLOB不支持遞歸遍歷子目錄,若想實現遞歸遍歷子目錄,請使用GLOB_RECURSE

4. 包含多個文件夾里的文件

file(GLOB SRC_LIST "*.cpp" "protocol/*.cpp")
add_executable(demo ${SRC_LIST})
# 或者
file(GLOB SRC_LIST "*.cpp")
file(GLOB SRC_PROTOCOL_LIST "protocol/*.cpp")
add_executable(demo ${SRC_LIST} ${SRC_PROTOCOL_LIST})
# 或者
aux_source_directory(. SRC_LIST)
aux_source_directory(protocol SRC_PROTOCOL_LIST)
add_executable(demo ${SRC_LIST} ${SRC_PROTOCOL_LIST})

5. 設置包含目錄

include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${CMAKE_CURRENT_BINARY_DIR}
    ${CMAKE_CURRENT_SOURCE_DIR}/include
)

Linux下還可以通過flag的方式設置:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_CURRENT_SOURCE_DIR}")

6. 設置鏈接庫搜索目錄

link_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}/libs64
)

Linux下還可以通過flag的方式設置:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_CURRENT_SOURCE_DIR}/libs64")

7. 設置需要鏈接的庫

鏈接庫目錄搜索

target_link_libraries(demo test)

該指令會在鏈接庫目錄(包括系統默認庫目錄和指定的自定義庫目錄)下搜索文件:

  • Windows下會搜索test.lib文件;
  • Linux下會搜索libtest.alibtest.so

當動態庫和靜態庫同時存在時,默認會優先鏈接動態庫,可以在鏈接時指定動態庫或靜態庫:

target_link_libraries(demo test.a)  # 鏈接靜態庫
target_link_libraries(demo test.so) # 鏈接動態庫

指定完整路徑

target_link_libraries(demo ${CMAKE_CURRENT_SOURCE_DIR}/lib/libtest.a)
target_link_libraries(demo ${CMAKE_CURRENT_SOURCE_DIR}/lib/test.so)

指定多個鏈接庫

target_link_libraries可以一次添加多個鏈接庫:

target_link_libraries(demo 
    ${CMAKE_CURRENT_SOURCE_DIR}/libs64/libtest.a 
    pthread)

8. 設置變量

1. set直接設置變量的值

set(SRC_LIST main.cpp test.cpp)
add_executable(demo ${SRC_LIST})

2. set追加變量的值

set(SRC_LIST main.cpp)
set(SRC_LIST ${SRC_LIST} test.cpp)
add_executable(demo ${SRC_LIST})

3. list追加或刪除變量的值

set(SRC_LIST main.cpp)
list(APPEND SRC_LIST test.cpp)
list(REMOVE_ITEM SRC_LIST main.cpp)
add_executable(demo ${SRC_LIST})

9. 條件控制

if...else...elseif...endif

if(MSVC)
    set(LINK_LIBS common)
else()
    set(boost_thread boost_log.a boost_system.a)
endif()

target_link_libraries(demo ${LINK_LIBS})


if(${CMAKE_BUILD_TYPE} MATCHES "debug")
    ...
else()
    ...
endif()

while break continue foreach endwhile endforeach

while(TRUE)
  message(STATUS "While true")
  break()
endwhile()

foreach(project_file ${COMMON_PROJECT_FILES})
        message(STATUS "project file found -- ${project_file}")
        include("${project_file}")
    endforeach()

10. 打印消息

message(${MY_VAR})
message("build with debug mode")
message(WARNING "this is warnning message")
message(FATAL_ERROR "this build has many error") # 會導致生成失敗

11. 包含其他cmake文件

include(./common.cmake) #指定包含文件的全路徑
include(def) #在搜索路徑中搜索def.cmake文件
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) #設置include的搜索路徑

12. 多目錄

可以使用add_subdirectory的方式添加子目錄,注意子目錄下也需要一個CMakeLists.txt文件。

https://www.cnblogs.com/hbccdf/p/introduction_of_cmake.html 中的例子說明,項目目錄是

./demo
    |
    +--- main.cc
    |
    +--- math/
          |
          +--- MathFunctions.cc
          |
          +--- MathFunctions.h

在添加cmake文件后結構如下:

./demo
    |
    +--- CMakeLists.txt
    |
    +--- main.cc
    |
    +--- math/
          |
          +--- CMakeLists.txt
          |
          +--- MathFunctions.cc
          |
          +--- MathFunctions.h

demo下的CMakeLists.txt文件如下:

cmake_minimum_required (VERSION 2.8)
project(demo)
aux_source_directory(. DIR_SRCS)

# 添加math子目錄
add_subdirectory(math)

# 指定生成目標
add_executable(demo ${DIR_SRCS})

# 添加鏈接庫
target_link_libraries(demo MathFunctions)

math目錄下的CMakeLists.txt文件如下:

aux_source_directory(. DIR_LIB_SRCS)
# 生成鏈接庫
add_library(MathFunctions ${DIR_LIB_SRCS})

在采用這種方式時,注意在寫代碼時就要規划好模塊。

13. 常用變量

1. 構建類型

CMAKE_BUILD_TYPE 對應的c編譯選項變量 對應的c++編譯選項變量
None CMAKE_C_FLAGS CMAKE_CXX_FLAGS
Debug CMAKE_C_FLAGS_DEBUG CMAKE_CXX_FLAGS_DEBUG
Release CMAKE_C_FLAGS_RELEASE CMAKE_CXX_FLAGS_RELEASE
RelWithDebInfo CMAKE_C_FLAGS_RELWITHDEBINFO CMAKE_CXX_FLAGS_RELWITHDEBINFO
MinSizeRel CMAKE_C_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_MINSIZEREL

2. 指定編譯類型

widnows

  1. windows中可以在VS中進行選擇配置, 默認都會生成四中配置。
  2. 要改變默認配置,需在cmake文件中配置:
set(CMAKE_CONFIGURATION_TYPES "Debug;RelWithDebInfo")
  1. 默認生成的平台類型為Win32,如果需要x64類型,則需要按如下命令執行:
cmake -G "Visual Studio 14 2015 Win64" ..

linux

  1. Linux下默認會生成none類型的配置;
  2. 可通過命令行指定配置:
cmake -DCMAKE_BUILD_TYPE=Debug ..
  1. 也可以在CMake文件中指定配置:
set(CMAKE_BUILD_TYPE DEBUG)

3. 變量

  • 自定義變量使用set來定義,如:
set(OBJ_NAME, xxxxx)
  • 使用時使用${},和shell類似,如${OBJ_NAME}
  • 在if命令里,直接使用變量名即可,不需要加${}

4. 內置變量

  • CMAKE_BINARY_DIR,PROJECT_BINARY_DIR,_BINARY_DIR:這三個變量內容一致,如果是內部編譯,就指的是工程的頂級目錄,如果是外部編譯,指的就是工程編譯發生的目錄。

  • CMAKE_SOURCE_DIR,PROJECT_SOURCE_DIR,_SOURCE_DIR: 這三個變量內容一致,都指的是工程的頂級目錄。

  • CMAKE_CURRENT_BINARY_DIR: 外部編譯時,指的是target目錄,內部編譯時,指的是頂級目錄

  • CMAKE_CURRENT_SOURCE_DIR: CMakeList.txt所在的目錄

  • CMAKE_CURRENT_LIST_DIR: CMakeList.txt的完整路徑

  • CMAKE_CURRENT_LIST_LINE: 當前所在的行

  • CMAKE_MODULE_PATH: 如果工程復雜,可能需要編寫一些cmake模塊-,這里通過SET指定這個變量

  • LIBRARY_OUTPUT_DIR,BINARY_OUTPUT_DIR: 庫和可執行的最終存放目錄

5. 環境變量

  • 使用環境變量:$ENV{Name}
  • 寫入環境變量:set(ENV{Name} value) #這里沒有“$”符號

14. 系統信息

  • CMAKE_MAJOR_VERSION,CMAKE 主版本號,比如2.4.6 中的2
  • CMAKE_MINOR_VERSION,CMAKE 次版本號,比如2.4.6 中的4
  • CMAKE_PATCH_VERSION,CMAKE 補丁等級,比如2.4.6 中的6
  • CMAKE_SYSTEM ,系統名稱,比如Linux-2.6.22
  • CMAKE_SYSTEM_NAME ,不包含版本的系統名,比如Linux
  • CMAKE_SYSTEM_VERSION ,系統版本,比如2.6.22
  • CMAKE_SYSTEM_PROCESSOR,處理器名稱,比如i686
  • UNIX ,在所有的類UNIX平台為TRUE,包括OS X 和cygwin
  • WIN32 ,在所有的win32 平台為TRUE,包括cygwin

15. 開關選項

  • BUILD_SHARED_LIBS: 用來控制默認的庫編譯方式,如果 不設置,使用add_library在沒有指定庫類型的情況下,默認生成的都是靜態庫。如果設置了set(BUILD_SHARED_LIBS ON)后,默認生成動態庫。
  • CMAKE_C_FLAGS設置C編譯選項,也可以通過add_definitions()添加
  • CMAKE_CXX_FLAGS設置C++編譯選項,也可以通過指令add_definitions()添加。
  • option可以添加cmake編譯選項。
    如我們想在代碼中添加一個宏:
...

#ifdef USE_MACRO

...

#endif

我們可以通過在項目中的CMakeLists.txt 中添加如下代碼控制代碼的開啟和關閉.

option(USE_MACRO
"Build the project using macro"
OFF)

IF(USE_MACRO)

    add_definitions("-DUSE_MACRO")

endif(USE_MACRO)

add_definitions的作用是添加一個代碼中可以使用的宏,而option的作用是添加一個cmake可以使用的參數,在構建項目時,你就可以使用如下指令進行控制:

cmake  -DUSE_MACRO=on ..
cmake  -DUSE_MACRO=off ..


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM