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使用筆記
轉載于:https://www.cnblogs.com/ZY-Dream/p/11232779.html
總結
以上是生活随笔為你收集整理的cmake用法及常用命令总结(全)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入探讨 Java 类加载器
- 下一篇: openssl 模块 安装 centso