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 入门

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

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