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


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

自己寫了一個小例子,包含了靜態庫和動態庫以及基本的依賴關系。

按照目錄結構加入文件(篩選器)
#按目錄結構加入文件
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中就可以用此變量作為當前目錄路徑

#變量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)

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

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

在Linux + GCC環境下,無論是Debug還是Release,生成的可執行程序會直接放在你所設置的目錄下,不會有差異.

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

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

在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使用筆記


免責聲明!

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



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