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版本$(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})
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)
# 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")
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)
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環境下,會自動在你所設置的目錄後面擴展一層
在Linux + GCC環境下,不管是Debug仍是Release,生成的可執行程序會直接放在你所設置的目錄下,不會有差別.3d
二. SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../lib)code
上面的語句能設置庫文件的輸出目錄
在Win + VS環境下,會自動在你所設置的目錄後面擴展一層
在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使用筆記