cMake 管理VS 項目

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的常用變量:

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:你猜~~

四、cmake中調用環境變量

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

六、區分debug和release

在工程目錄下,cmake -DCMAKE__BUILD_TYPE=DEBUG(RELEASE),再執行make

七、指定編譯32bit或64bit程序

SET(CMAKE_C_FLAGS “${CMAKE_C_FLAGS} -m32”)

SET(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -m32”)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章