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”)

 

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