1. CMake簡介:
CMake的特點是:
Cmake需要用戶用CMake規範的語法編寫CMake的腳本,而CMake的腳本語法簡單易用,入門非常容易
原生支持C/C++/Fortan/Java的相依性的自動分析功能,免除了程序員對代碼依賴的調整,對整個工程項目的構建非常有幫助。
支持QT、FLTK等開發框架。
支持跨平臺編譯,並可以生成native編譯配置文件,在linux/unix平臺,生產makefile,在mac平臺可以生成xcode,在windows平臺可以生成msvc工程的配置文件。
能夠管理大型項目,效率非常高。
可以擴展,可爲cmake編寫特定功能的模塊,擴充cmake功能。
2. CMake常用語句摘錄:
掌握CMake還是從一個較爲完整的工程項目的CMake來分析比較實用,也具有針對性。
以下摘錄的是一箇中型項目工程的CMakeLists.txt的關鍵語句。在由CMake構建工程項目時,需要在每一級目錄都編寫管理對應級目錄內的資源文件。最主要的CMakeLists.txt有兩級,最外層的和存放工程源代碼的Source目錄下的CMakeLists.txt。
最外層的CMakeLists.txt一般會定義一些全局的變量,供之後Source目錄中,需要涉及到整個項目的Bin,Lib,Include,Thirdprty,CommonInclude等時用到的全局變量,還有就是指定需要包含的Thirdparty的bin的存放目錄。通過在CMakeList中進行定義,可以省去在CMake GUI裏進行手動設置的操作。
3.1 外層CMakeLists.txt的一般語句:
(1) CMAKE_MINIMUM_REQUIRED(VERSION 2.8.9) //指定需要的最小版本
(2) PROJECT( Project Name ) //項目名稱
(3)SET(PLATFORM_NAME “${PlatformName}”) // 設置平臺名稱(x64)
SET(CONFIGURATION_NAME “${ConfigurationName}”) //設置配置名稱(Release/Debug....)
(4)
FIND_PATH(QT_DIR “” “” NO_DEFAULT_PATH)//搜尋路徑
SET(Project_Include “${CMAKE_CURRENT_SOURCE_DIR}/Include”) //設置.h文件路徑
SET(Project_Bin “${CMAKE_CURRENT_SOURCE_DIR}/Bin/&{PLATFORM_NAME}”) //設置Project_Bin 代表路徑
SET(Project_Lib “${CMAKE_CURRENT_SOURCE_DIR}/Lib/&{PLATFORM_NAME}”)//設置Project_Lib 代表路徑
ADD_SUBDIRECTORY(Directory Name) //將Code 加進目錄中
(5) INCLUDE_DIRECTORIES(
${ITK_DIR}/include/ITK-5.0 //依賴三方庫所有頭文件目錄
...
)
LINK_DIRECTORIES(
${ITK_DIR}/lib/${ConfigurationName} //依賴三方庫的所有.lib 目錄
${OPENCV_DIR}/build/x64/vc14/lib
)
3.2 Source級目錄內的CMakeLists.txt的一般語句:
SET(file_SourceFiles //設置自己編寫的索引.cpp文件
asetsBinaryMF2D.cpp
.....
)
SOURCE_GROUP("Source Files" FILES ${file_SourceFiles})
SET(file_HeaderFiles
../Include/asetsBinaryMF2D.h //設置自己編寫的索引.h文件,因爲.h與.cpp一般會存放不同的目錄,此時的根目錄默認是cmake文件所在目錄,所以需要退出當前目錄,../ 代表退出當前文件夾,../../ 代表退出到第二層文件夾
....
)
SOURCE_GROUP("Header Files" FILES ${file_HeaderFiles})
SET(srcs ${file_SourceFiles} ${file_HeaderFiles})
FIND_PACKAGE(Qt5Core REQUIRED)
INCLUDE_DIRECTORIES(
${Include_Root}
${CMAKE_CURRENT_SOURCE_DIR}
)
LINK_DIRECTORIES(
${Lib_Root}/${ConfigurationName}
)
IF(LIMIT_VERSION)
ADD_DEFINITIONS(
-DLIMIT_VERSION
)
ENDIF()
add_executable(BrainExtraction ${srcs} ${headers} ${MOCSrcs} ${qrcs} ${RCSrcs} ${WINRCSrcs}) //生成exe文件
install(TARGETS BrainExtraction
RUNTIME DESTINATION ${Bin_Root}
)
ADD_LIBRARY(ProjectName SHARED ${srcs} ${headers} ${MOCSrcs}) //指定生成dll文件
SET_TARGET_PROPERTIES(BrainExtraction
PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${Bin_Root} //設置屬性:exe文件的生成目錄爲Bin_Root
)
SET_TARGET_PROPERTIES(BrainExtraction
PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY ${Lib_Root}
)
TARGET_LINK_LIBRARIES(BrainExtraction
opencv_world348.lib //列舉出代碼運行需要的所有lib 庫
)
4、Cmake 生成解決方案後,打開,設置main 函數所在的項目爲啓動項(選中該工程,右鍵單擊可見),依次編譯、運行即可,如果報找不到三方庫的dll文件,可在cmake中添加如下語句指定,注意VS_DEBUGGER_WORKING_DIRECTORY 包括release、debug 等,不需要單獨指定,奇怪的是 用ConfigurationName指定release、debug 時,還是報找不到,改成release即可,不知問題出在哪。
SET_TARGET_PROPERTIES(BrainExtraction
PROPERTIES
VS_DEBUGGER_WORKING_DIRECTORY ${ITK_DIR}/bin/${ConfigurationName}
)
5、常用變量
一、變量的引用方式是使用“${}”,在IF中,不需要使用這種方式,直接使用變量名即可
二、自定義變量使用SET(OBJ_NAME xxxx),使用時${OBJ_NAME}
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:庫和可執行的最終存放目錄
PROJECT_NAME:你猜~~
1.Using $ENV{NAME} : invoke system environment varible.
We can use “SET(ENV{NAME} value)” as well. note that the “ENV” without “$”.
2.CMAKE_INCLUDE_CURRENT_DIR equal to INCLUDE_DIRECTORY(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
1.BUILD_SHARED_LIBS:set the default value when using ADD_LIBRARY()
2.CMAKE_C_FLAGS: set compiler for c language
2.CMAKE_CXX_FLAGS: set compiler for c++ language
在工程目錄下,cmake -DCMAKE__BUILD_TYPE=DEBUG(RELEASE),再執行make
SET(CMAKE_C_FLAGS “${CMAKE_C_FLAGS} -m32”)
SET(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -m32”)