cmake文档书写

cmake文档虽然之前自己没写过,不过systemworkbench里和Clion里都接触到了里面的各种参数,所以要自己写一个CMakeLists.txt还是比较无痛的。

主要部分如下:

  • 编译器声明:
cmake_minimum_required(VERSION 2.8)
  • Project名称:
project(test)

这一行指定项目的名称,指定项目名称最主要的目的在于启用几个和环境相关的变数,另外也会在 makefile 增加对应的 target。

set (CMAKE_CXX_STANDARD 11)

采用c++11标准编译

  • message:
message("config types: ${CMAKE_CONFIGRATION}")
  • 添加的声明(这里和SW4STM32里DEFIN选项里参数一样)
add_definitions(-DEXTERNAL)
  • Include文件夹地址
include_directories(
  ${PROJECT_SOURCE_DIR}
  ${PROJECT_SOURCE_DIR}/include/
  ${PROJECT_SOURCE_DIR}/thirdparty/stm32/include/
  ${PROJECT_SOURCE_DIR}/thirdparty/RTOS/include/
)
  • 链接文件地址
link_directories(
 ${PROJECT_SOURCE_DIR}/thirdparty/stm32/lib/
 ${PROJECT_SOURCE_DIR}/thirdparty/RTOS/lib/
)
  • 设定一个名为SOURCE_LIST的变量,用于汇集所有的源文件的地址
set(SOURCE_LIST
    src/main.cpp
)
  • 建立可执行文件
add_executable(test ${SOURCE_LIST})

建立一个名为test的可执行文件,源文件通过SOURCE_LIST变量输入

  • 指定链接项目
target_link_libraries(
    stm32
    RTOS
)

指令 target_link_libraries()用于指定 target 所需要链接的项目,并且可以依不同组态选择不同的连结项目。
注意这里的库文件一定要放在指定目录下,不然会找不到

  • 库生成
link_directories(${PROJECT_SOURCE_DIR}/lib)
add_library(data STATIC ${SOURCE_FILES})

这里从之前设置的SOURCE_FILES变量里生成一个库文件。其中STATIC表示生成静态库,SHARED是生成动态库。生成库文件可以用于上文提到的target_link_libraries()链接

关于静态库和动态库的区别解释如下:

静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。

动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。

  • 链接库
target_link_libraries(hello A B.a C.so)

将若干库文件链接到生成的目标hello(libhello.a或libhello.so)

需要注意的是,target_link_libraries里库文件的顺序符合gcc链接顺序的规则,即被依赖的库放在依赖它的库的后面,比如上面的命令里,libA.so可能依赖于libB.a和libC.so,如果顺序有错,链接时会报错。还有一点,B.a会告诉CMake优先使用静态链接库libB.a,C.so会告诉CMake优先使用动态链接库libC.so,也可直接使用库文件的相对路径或绝对路径。使用绝对路径的好处在于,当依赖的库被更新时,make的时候也会重新链接。

  • 指定输出目录
set(OUTPUT_ROOT ${PROJECT_SOURCE_DIR}/output)

关于输出目录还可以依次指定:

在前面的例子里我们并没有特别指定输出档的位置,因此档案会分布在 binary tree 当中,而 binary tree 的架构则和 source tree 相同。

这里先介绍 CMake 对于档案的分类

Windows Unix
RUNTIME .exe、.dll 可执行档
LIBRARY .so
ARCHIVE .a、.lib
包含 dll 的连结界面 .a
对应三者输出位置的全域变数为 CMAKE_RUNTIME_OUTPUT_DIRECTORY、>CMAKE_LIBRARY_OUTPUT_DIRECTORY 和 >CMAKE_ARCHIVE_OUTPUT_DIRECTORY。通常我们可能会这样指定:

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
上面这种写法会将整个 binary tree 下所建置的执行档以及静态、共享程式库搜集到建置目录的 bin 和 lib 下。


参考文档:
维基教科书-CMake 入门

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • CMake学习 本篇分享一下有关CMake的一些学习心得以及相关使用。 本文目录如下: [1、CMake介绍] [...
    AlphaGL阅读 12,302评论 11 79
  • 注:首发地址 1. 前言 当在做 Android NDK 开发时,如果不熟悉用 CMake 来构建,读不懂 CMa...
    cfanr阅读 24,588评论 1 53
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,087评论 19 139
  • 1.安装 $sudo apt-get install cmake 2.示例:简单的文件目录 sample |—...
    荷包蛋酱阅读 29,747评论 0 15
  • 《千与千寻》讲述了少女千寻意外来到灵异世界后发生的故事。这部影片曾获得柏林国际电影节最高荣誉的金熊奖,且是目前唯一...
    影子影阅读 8,520评论 119 282