cmake用法及經常使用命令總結(全)

CMakeLists.txt 的語法比較簡單,由命令、註釋和空格組成,其中命令是不區分大小寫的。指令是大小寫無關的,參數和變量是大小寫相關的。但推薦所有使用大寫指令。符號 # 後面的內容被認爲是註釋。命令由命令名稱、小括號和參數組成,參數之間使用空格進行間隔。html

本身寫了一個小例子,包含了靜態庫和動態庫以及基本的依賴關係。編程

按照目錄結構加入文件(篩選器)
#按目錄結構加入文件
macro(create_filters source_files)
    if(MSVC)
        # 獲取當前目錄
        set(current_dir ${CMAKE_CURRENT_SOURCE_DIR})
        foreach(src_file ${${source_files}})
            # 求出相對路徑
            string(REPLACE ${current_dir}/ "" rel_path_name ${src_file})
            # 刪除相對路徑中的文件名部分
            string(REGEX REPLACE "(.*)/.*" \\1 rel_path ${rel_path_name})
            # 比較是不是當前路徑下的文件
            string(COMPARE EQUAL ${rel_path_name} ${rel_path} is_same_path)
            # 替換成Windows平臺的路徑分隔符
            string(REPLACE "/" "\\" rel_path ${rel_path})
            if(is_same_path)
                set(rel_path "\\")
            endif(is_same_path)

            # CMake 命令
            source_group(${rel_path} FILES ${src_file})
        endforeach(src_file)
    endif(MSVC)
endmacro(create_filters)


#用法
#全部文件保存在一個變量中       
file(GLOB_RECURSE all_files *.h *.cpp *.c *.cc) 
create_filters(all_files)

add_executable(MFCDemo
               ${all_files}            
               )
根據debug和release自動區分表示debug和release文件夾
#debug版本$(Configuration)表示debug文件夾
link_directories(${PROJECTS_PATH}/out/$(Configuration))
將當前目錄添加到環境變量中

能夠用bat命令數組

setx ZYB_MEDIA_DIRECTORY %cd%

以後cmake中就能夠用此變量做爲當前目錄路徑post

#變量ZYB_MEDIA_DIRECTORY表示上述bat文件所在目錄
set(ZYB_MEDIA_DIRECTORY $ENV{ZYB_MEDIA_DIRECTORY})
構建成功後複製依賴的dll到指定目錄
set(LIB_FILE ${ZYB_MEDIA_DIRECTORY}/third_party/ffmpeg/lib-x86)
#構建成功後複製依賴的dll
add_custom_command(TARGET PlayerTest POST_BUILD 
                   COMMAND ${CMAKE_COMMAND} -E copy ${LIB_FILE}/avcodec-58.dll ${EXECUTABLE_OUTPUT_PATH}/$(CONFIGURATION)
                   COMMAND ${CMAKE_COMMAND} -E copy ${LIB_FILE}/avfilter-7.dll ${EXECUTABLE_OUTPUT_PATH}/$<CONFIGURATION>
                   COMMAND ${CMAKE_COMMAND} -E copy ${LIB_FILE}/avformat-58.dll ${EXECUTABLE_OUTPUT_PATH}/$<CONFIGURATION>
                   COMMAND ${CMAKE_COMMAND} -E copy ${LIB_FILE}/avutil-56.dll ${EXECUTABLE_OUTPUT_PATH}/$<CONFIGURATION>
                   COMMAND ${CMAKE_COMMAND} -E copy ${LIB_FILE}/postproc-55.dll ${EXECUTABLE_OUTPUT_PATH}/$<CONFIGURATION>
                   COMMAND ${CMAKE_COMMAND} -E copy ${LIB_FILE}/swresample-3.dll ${EXECUTABLE_OUTPUT_PATH}/$<CONFIGURATION>
                   COMMAND ${CMAKE_COMMAND} -E copy ${LIB_FILE}/swscale-5.dll ${EXECUTABLE_OUTPUT_PATH}/$<CONFIGURATION>
                   COMMAND ${CMAKE_COMMAND} -E copy ${LIB_FILE}/SDL.dll ${EXECUTABLE_OUTPUT_PATH}/$<CONFIGURATION>
                   )
設置宏定義
#宏定義
add_definitions(-D WEBRTC_WIN)
add_definitions(-D CURL_STATICLIB)
add_definitions(-D NOMINMAX)
MFC相關
# 1 在靜態庫中使用MFC,2共享方式使用mfc
set(CMAKE_MFC_FLAG 1)
#共享DLL中使用 MFC
#add_definitions(-D_AFXDLL)
#UNICODE字符集
add_definitions(-DUNICODE -D_UNICODE)
#子系統窗口             
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS")
Qt相關
cmake_minimum_required(VERSION 3.2.0)
project(QtDemo)

#設置工程包含當前目錄,非必須
set(CMAKE_INCLUDE_CURRENT_DIR ON)
 
#打開全局moc,設置自動生成moc文件,必定要設置
set(CMAKE_AUTOMOC ON)
#打開全局uic,非必須
set(CMAKE_AUTOUIC ON)
#打開全局rcc,非必須,如需打開,注意修改33行的qrc文件名
#set(CMAKE_AUTORCC ON)

#查找須要的Qt庫文件,最好每個庫都要寫,Qt也會根據依賴關係自動添加
find_package(Qt5Widgets) 
find_package(Qt5Core)
find_package(Qt5Gui)
find_package(Qt5Network)

include_directories(${PROJECTS_PATH}/../src)
include_directories(${ZYB_MEDIA_DIRECTORY}/third_party/qBreakpad/handler)
include_directories(${ZYB_MEDIA_DIRECTORY}/third_party/qBreakpad/handler/third_party/breakpad/src)

link_directories(${ZYB_MEDIA_DIRECTORY}/third_party/qBreakpad/lib/$(Configuration))
link_directories(${PROJECTS_PATH}/out/$(Configuration))

#查找當前文件夾中的全部源代碼文件,也能夠經過Set命令將全部文件設置爲一個變量
#查找設置當前文件夾中全部的ui文件
FILE(GLOB UI_FILES "./*.ui")

file(GLOB_RECURSE all_files *.h *.cpp *.c *.cc LY_Utils/*.*) 
create_filters(all_files)

#經過Ui文件生成對應的頭文件,必定要添加
qt5_wrap_ui(WRAP_FILES ${UI_FILES})

#添加資源文件,非必須,一旦採用,注意修改相應的qrc文件名
#set(RCC_FILES QtDemo.qrc)

#將ui文件和生成文件整理在一個文件夾中,非必須
#source_group("Ui" FILES ${UI_FILES} ${WRAP_FILES} )

SET(EXECUTABLE_OUTPUT_PATH ../out)

#建立工程文件
add_executable(QtDemo ${all_files} ${WRAP_FILES})

#添加Qt5依賴項
target_link_libraries(QtDemo Qt5::Widgets Qt5::Core Qt5::Gui Qt5::Network)
cmake中一些預約義變量

PROJECT_SOURCE_DIR 工程的根目錄
PROJECT_BINARY_DIR 運行cmake命令的目錄,一般是${PROJECT_SOURCE_DIR}/build
CMAKE_INCLUDE_PATH 環境變量,非cmake變量
CMAKE_LIBRARY_PATH 環境變量
CMAKE_CURRENT_SOURCE_DIR 當前處理的CMakeLists.txt所在的路徑
CMAKE_CURRENT_BINARY_DIR target編譯目錄
使用ADD_SURDIRECTORY(src bin)能夠更改此變量的值
SET(EXECUTABLE_OUTPUT_PATH <新路徑> )並不會對此變量有影響,只是改變了最終目標文件的存儲路徑
CMAKE_CURRENT_LIST_FILE 輸出調用這個變量的CMakeLists.txt的完整路徑
CMAKE_CURRENT_LIST_LINE 輸出這個變量所在的行
CMAKE_MODULE_PATH 定義本身的cmake模塊所在的路徑
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake),而後能夠用INCLUDE命令來調用本身的模塊
EXECUTABLE_OUTPUT_PATH 從新定義目標二進制可執行文件的存放位置
LIBRARY_OUTPUT_PATH 從新定義目標連接庫文件的存放位置
PROJECT_NAME 返回經過PROJECT指令定義的項目名稱
CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS 用來控制IF ELSE語句的書寫方式 學習

設置輸出目錄

一. SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../bin)ui

上面的語句能設置可執行文件的輸出目錄.net

在Win + VS環境下,會自動在你所設置的目錄後面擴展一層 目錄,因此最終生成的Debug版本程序會在 ${PROJECT_SOURCE_DIR}/../bin/Debug 目錄下,Release版本程序會在 ${PROJECT_SOURCE_DIR}/../bin/Release 目錄下. debug

在Linux + GCC環境下,不管是Debug仍是Release,生成的可執行程序會直接放在你所設置的目錄下,不會有差別.3d

二. SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../lib)code

上面的語句能設置庫文件的輸出目錄

在Win + VS環境下,會自動在你所設置的目錄後面擴展一層 目錄,因此最終生成的Debug版本庫會在 ${PROJECT_SOURCE_DIR}/../lib/Debug 目錄下,Release版本庫會在 ${PROJECT_SOURCE_DIR}/../lib/Release 目錄下.

在Linux + GCC環境下,不管是Debug仍是Release,生成的庫文件會直接放在你所設置的目錄下,不會有差別.

三. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/../bin) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/../bin)

上面兩條語句分別設置了Debug版本和Release版本可執行文件的輸出目錄,

一旦設置上面的屬性,在任何環境下生成的可執行文件都將直接放在你所設置的目錄.

四. set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/../lib) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/../lib)

上面兩條語句分別設置了Debug版本和Release版本庫文件的輸出目錄,

一旦設置上面的屬性,在任何環境下生成的庫文件都將直接放在你所設置的目錄.

五. set(CMAKE_DEBUG_POSTFIX "_d") set(CMAKE_RELEASE_POSTFIX "_r")

上面兩條語句分別設置了Debug版本和Release版本下庫文件的後綴名.

六. set_target_properties(${TARGET_NAME} PROPERTIES DEBUG_POSTFIX "_d") set_target_properties(${TARGET_NAME} PROPERTIES RELEASE_POSTFIX "_r")

上面兩條語句分別設置了Debug版本和Release版本下可執行文件的後綴名.

更多參考:

cmake使用示例與整理總結
CMake 設置Target輸出目錄和後綴名
cmake 簡介
CMake命令:CMake構建系統的骨架
CMake: 將文件從源目錄複製到二進制目錄_cmake_幫酷編程知識庫
CMake經驗
cmake設置mfc編譯項目
用 cmake 構建Qt工程(對比qmake進行學習)
基於Cmake+QT+VS的C++項目構建開發編譯簡明教程
cmake使用筆記

相關文章
相關標籤/搜索