CMake 构建项目

Cmake介绍

CMake意为cross-platform make,可用于管理c/c++工程。CMake解析配置文件CMakeLists.txt生成Makefile,相比直接用Makefile管理工程,CMake更灵活和简单。

项目架构

项目的目录结构如下所示

项目的目录结构如下所示,包括静态库和动态库项目,同时也包括一个测试项目。

.
├── bin
│   └── test1
├── CMakeLists.txt
├── include
│   └── apple.h
├── lib
│   ├── liblearn.a
│   ├── liblearn.so -> liblearn.so.1
│   ├── liblearn.so.1 -> liblearn.so.1.0
│   └── liblearn.so.1.0
├── src
│   ├── apple.cpp
│   └── CMakeLists.txt
└── test
    ├── CMakeLists.txt
    └── main.cpp

5 directories, 11 files
  1. bin 可执行文件的生成目录,lib 链接库文件的生成目录,include 头文件所在目录,src 源代码文件所在目录,test 测试程序源代码所在目录。

  2. 根目录 CMakeList.txt

     cmake_minimum_required(VERSION 3.5)
     
     project( cmake_learn )
     
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
     
     add_subdirectory( src )
     add_subdirectory( test )
    
  3. src 目录 CMakeList.txt

     # 搜集所有在指定路径下的源文件的文件名,将输出结果列表储存在指定的变量中。
     aux_source_directory(. SOURCE_FILES )
     
     # 或者使用下面这种方式。
     #set( SOURCE_FILES
     #        apple.cpp
     #        orage.cpp )
     
     # 添加包含目录,CMake将在这些目录寻找 .cpp 文件中引用到的头文件。
     include_directories( ${PROJECT_SOURCE_DIR}/include )
     
     # 指定编译后的库文件的输出路径。
     set( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib )
     
     # 生成目标动态库。
     add_library( learn SHARED ${SOURCE_FILES} )
     
     # 生成目标静态库。
     add_library( learn_static STATIC ${SOURCE_FILES} )
     
     # 指定静态库的输出名称。
     set_target_properties( learn_static PROPERTIES OUTPUT_NAME "learn" )
     
     # 允许静态库与动态库同时存在。
     set_target_properties( learn PROPERTIES CLEAN_DIRECT_OUTPUT 1 )
     set_target_properties( learn_static PROPERTIES CLEAN_DIRECT_OUTPUT 1 )
     
     # 指定动态库的版本:
     # VERSION 动态库版本;
     # SOVERSION API的版本。
     set_target_properties( learn PROPERTIES VERSION 1.0 SOVERSION 1 )
    
  4. test 目录 CMakeList.txt

     # 搜集所有在指定路径下的源文件的文件名,将输出结果列表储存在指定的变量中。
     aux_source_directory(. SOURCE_FILES )
     # 添加包含目录,CMake将在这些目录寻找 .cpp 文件中引用到的头文件。
     include_directories( ${PROJECT_SOURCE_DIR}/include )
     
     # 指定编译后的可执行程序的输出路径。
     set( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin )
     
     # 指定生成可执行程序。
     add_executable( test1 ${SOURCE_FILES} )
     
     # 添加链接库目录,CMake将在如下如目录中查找所链接的外部库。
     link_directories( ${PROJECT_SOURCE_DIR}/lib )
     
     # 指定链接库。
     target_link_libraries( test1
             learn )
    

命令总结

  • set_target_properties

      set_target_properties(target1 target2 ...
                            PROPERTIES prop1 value1
                            prop2 value2 ...)
    

本命令用来配置target的属性(一般用于静态库或动态库)
OUTPUT_NAME 输出名的设定
PREFIX 输出前缀的设定
POSTFIX 输出后缀的设定

  • link_directories : 动态链接库或静态链接库的搜索路径

  • add_library : 编译动态(静态)库

  • add_subdirectory : 包含子目录

  • include_directories : 指定头文件的搜索路径

  • install : 指令用于定义安装规则,安装的内容可以包括目标二进制、动态库、静态库以及文件、目录、脚本等

      INSTALL(TARGETS targets...[[ARCHIVE|LIBRARY|RUNTIME][DESTINATION <dir>][PERMISSIONS permissions...][CONFIGURATIONS
      [Debug|Release|...]][COMPONENT <component>][OPTIONAL]]
    
  • target_link_libraries : 将若干库文件链接到生成的目标

      target_link_libraries(<target> [item1 [item2 [...]]]
                            [[debug|optimized|general] <item>] ...)
    

The named must have been created in the current directory by a command such as add_executable() or add_library().

  • 查找源文件

    • aux_source_directory(. SRC_LIST) : 查找当前目录下所有的源文件并保存到SRC_LIST变量里
    • file(GLOB CMAKE_FILES “src/cmake*”) : 查找src目录下所有以cmake开头的文件并保存到CMAKE_FILES变量里
    • file(GLOB_RECURSE CMAKE_FILES “src/cmake*”) : file命令同时支持目录递归查找
  • 传递FLAGS给C++编译器:设置CMAKE_CXX_FLAGS变量

      set(CMAKE_CXX_COMPILER      "clang++" )         # 显示指定使用的C++编译器
      set(CMAKE_CXX_FLAGS   "-std=c++11")             # c++11
      set(CMAKE_CXX_FLAGS   "-g")                     # 调试信息
      set(CMAKE_CXX_FLAGS   "-Wall")                  # 开启所有警告
      set(CMAKE_CXX_FLAGS_DEBUG   "-O0" )             # 调试包不优化
      set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG " )   # release包优化
    

解释

CMAKE_CXX_FLAGS 是CMake传给C++编译器的编译选项,通过设置这个值就好比 g++ -std=c++11 -g -Wall

CMAKE_CXX_FLAGS_DEBUG 是除了CMAKE_CXX_FLAGS外,在Debug配置下,额外的参数

CMAKE_CXX_FLAGS_RELEASE 同理,是除了CMAKE_CXX_FLAGS外,在Release配置下,额外的参数

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kuokay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值