帮你快速构建自己的cmake工程

       本文旨在用较短的篇幅介绍一个cmake构建C++工程结构,并提供一个工程实例,方便大家参考。如果您时间充裕或想系统学习cmake,请参考本文最后的下载链接。

       cmake的用途定义等不在此讨论,下面以目录为索引进行讲解。

一、工程目录结构介绍

                                                                     帮你快速构建自己的cmake工程

 

       FastCmakeDemo:工程根目录

        MathFunctionLib:数学工具库(代码)

        src:工程主体代码

        bin:可执行程序生成目录

        build:camke生成中间产物路径

        doc:项目文档安装路径

        hello:src子目录,用于表示复杂工程目录

        installDir:工程安装路径

二、FastCmakeDemo 下配置

      FastCmakeDemo作为根目录主要负责对工程进行全局配置,功能点有:              

     1. 定义工程名称

     PROJECT (FastCmakeDemo)

     2. 配置编译参数

     设置工程编译类型:

      SET(CMAKE_BUILD_TYPE "Debug")

     设置工程编译参数:

     SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")

      SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

     3.向源码中传入cmake配置置

#此部分演示通过cmake向CXX工程传递参数

# 我们应该使用我们自己的数学函数吗?

option (USE_MYMATH "Use tutorial provided math implementation" ON)

# 版本号

set (Tutorial_VERSION_MAJOR 1)

set (Tutorial_VERSION_MINOR 0)

configure_file (

    #cmake配置

    "${PROJECT_SOURCE_DIR}/TutorialConfig.h.in"

    #转换成头文件给cxx工程

    "${PROJECT_SOURCE_DIR}/src/TutorialConfig.h"

  )

TutorialConfig.h.in:

// 与工程相关的配置的选项与设置;

#define Tutorial_VERSION_MAJOR @[email protected]

#define Tutorial_VERSION_MINOR @[email protected]

#define USE_MYMATH @[email protected]

        4. 配置安装信息

#配置install相关

IF(CMAKE_BUILD_TYPE)

set(CMAKE_INSTALL_PREFIX "${PROJECT_SOURCE_DIR}/installDir/Debug/usr")

ELSE()

set(CMAKE_INSTALL_PREFIX "${PROJECT_SOURCE_DIR}/installDir/Release/usr")

ENDIF()

INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake/)

INSTALL(PROGRAMS runhello.sh DESTINATION bin)

INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake/)

     5. 引入下一层目录

ADD_SUBDIRECTORY(MathFunctionLib)

#添加工程目录,包含main.cxx的放在最后面,src为源码路径,bin为生成路径

ADD_SUBDIRECTORY(src bin)

三、MathFunctionLib下配置

       本级目录主要演示功能为生成链接库,目录结构见下图:

                                                            帮你快速构建自己的cmake工程

 

      功能点有:

      1. 添加源文件

      添加链接库功能实现源码。

      aux_source_directory(. DIR_LIB_SRCS)

      ADD_LIBRARY(math_shared SHARED ${DIR_LIB_SRCS})

      ADD_LIBRARY(math_static STATIC ${DIR_LIB_SRCS})

     2. 设置库生成路径

      SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

     3. 设置库导出名称

      SET_TARGET_PROPERTIES(math_shared PROPERTIES OUTPUT_NAME "math")

      SET_TARGET_PROPERTIES(math_static PROPERTIES OUTPUT_NAME "math")

      4. 设置动态库版本号

      SET_TARGET_PROPERTIES(math_shared PROPERTIES VERSION 1.2 SOVERSION 1)

      5. 配置生成路径

       set(CMAKE_INSTALL_PREFIX lib)

       INSTALL(TARGETS math_static math_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)

       INSTALL(FILES mysqrt.h DESTINATION include/MathFunctionLib)

      四. src下的配置

      本级目录主要演示功能源码顶层目录(main.cxx所在路径)配置,目录结构见下图:

                                                                       帮你快速构建自己的cmake工程

      功能点有:

      1.添加源文件

      AUX_SOURCE_DIRECTORY(. SRC_LIST)

      2.配置所需头文件路径

      INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/MathFunctionLib)

      INCLUDE_DIRECTORIES(${CMAKE_CURRENT_LIST_DIR}/hello)

      3. 配置所需库

      #库目录,需要放在ADD_EXECUTABLE方法之前

      LINK_DIRECTORIES(${PROJECT_BINARY_DIR}/lib)

      #math即上一节中提到的库,hello(也是库)下一节介绍。

      TARGET_LINK_LIBRARIES(a hello math)

      4. 配置生成目标

      a即为工程最后生成的可执行文件

       ADD_EXECUTABLE(a ${SRC_LIST})

      5. 引入下一层目录

      ADD_SUBDIRECTORY(${CMAKE_CURRENT_LIST_DIR}/hello)

      6. 引入依赖

       下一节介绍。

        ADD_DEPENDENCIES(a hello_static)

      7. 配置生成路径

       INSTALL(TARGETS a  RUNTIME DESTINATION bin)

       五、hello下的配置

       Hello为src的子目录,main.cxx通过引入静态链接库的方式连接子目录中相关功能的实现。所以需要四中6的配置。这样才会编译hello目录下的代码。目录结构见下图。

                                                                       帮你快速构建自己的cmake工程

 配置类似三只需生成静态库即可。

      六、编译安装工程

帮你快速构建自己的cmake工程

 

      七、参考

      1. Cmake practice,一步步构建一个功能复杂的cmake工程,博主主要参考的教程。

      2. CGold Documentation,​​​​​​​对cmake各种功能特性有较详细的介绍。