CMake基础使用整理

CMake是一个跨平台的编译工具,可以一次编写,在不同平台自动生成对应的Makefile文件,减少了手写Makefile以及适配不同平台时的耗时。

前言

之前大部分时候在windows端使用VS开发,因此对Makefile、CMake等工具接触较少。最近尝试从头实现一个简单的HTTP服务器,主要开发环境在Linux,因此借此契机熟悉一下CMake等构建工具的使用。

目录结构

目前项目文件较少,使用了较简单的目录结构

┣━ src
┃   ┣━ CMakeLists.txt
┃   ┣━ HttpRequest.cpp
┃   ┣━ HttpResponse.cpp
┃   ┣━ HttpServer.cpp
┃   ...
┣━ include
┃   ┣━ HttpRequest.h
┃   ┣━ HttpResponse.h
┃   ┣━ HttpServer.h
┃   ...
┣━ cmake-build-debug
┃   ┣━...
┃   ┗━...
┣━ main.cpp
┣━ CMakeLists.txt

可以看到源文件和头文件分别存储在对应目录中,根目录下以main.cpp作为程序入口,最终构建目标及中间文件存放在cmake-build-debug这一独立文件夹中。

CMakeLists编写

为了使上述目录结构能够正确编译链接,我们需要编写CMakeLists.txt,同时CMake能够一定程度上减少多文件多目录时来回链接顺序等头疼的问题。在这个项目里,根目录下和src目录下各有一个CMakeLists.txt文件,这也是CMake的特点,可以将Makefile拆分,每个目录各自进行编译,最终链接起来。

根目录下的CMakeLists.txt内容如下

cmake_minimum_required (VERSION 2.6)

add_definitions(-std=c++11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -g -Wall -Wno-unused-variable -pthread")

project (Minihttpd)

include_directories(include)
add_subdirectory(src)

# 顺序不可修改,先link_directories 再 add_executable 最后 target_link_libraries
link_directories(/usr/local/lib)

add_executable(Minihttpd main.cpp)

target_link_libraries(Minihttpd src)
target_link_libraries(Minihttpd -lconfig++)

接下来对每条语句进行简单的解释

  • add_definations 指令可以用来手动设置某些宏的开闭,控制编译选项,这里主要是标注使用c++11标准
  • set指令能够用前面的变量替代后面的字符串,这里实际上是对预定义的CMAKE_CXX_FLAGS变量进行了一个修改,来设置某些选项,主要链接pthread库使用多线程
  • project指令用来设置项目名(包括版本、所用语言等信息,这里缺省)
  • include_directories指令用来指定寻找头文件的路径,这里把include目录加入到头文件搜索范围内,使得项目内文件可以找到对应头文件
  • add_subdirectory指令用来把子目录加入到构建列表中,最终构建结果存放在src变量中

之后的几行是在项目需要引用其他动态链接库,非常需要注意的地方

  • add_executable指令用来指定项目最终构建的目标文件,以及所需要的所有源文件。可以看到这里只有main.cpp,为什么没有包含src目录下其他源文件?这里其实在下面使用 target_link_libraries 指令,以动态链接库的形式引入进来。其顺序是在子目录中首先进行了部分构建,在src目录下生成了相应的libsrc.a文件,最终链接到程序入口文件上,实现了构建。
  • link_directories和target_link_libraries指令用来引入外部的动态链接库。其中
    • link_directories用来指定该动态链接库所在目录
    • target_link_libraries用来把所需的动态链接库引入到该项目中

这里非常需要注意的是几条语句的顺序,一定是

  1. link_directories 把动态链接库所在目录加入寻找列表中
  2. add_executable 指定最终构建目标名称
  3. target_link_libraries 把需要的动态链接库加入到项目中

这里的顺序错误将导致链接失败,出现找不到动态链接库等各种问题(踩过的坑,心酸的泪)

子目录下的CMakeLists.txt内容如下

aux_source_directory(. srcs)
add_library(src ${srcs})

这里的内容就非常简单

  • aux_source_directory指令把当前目录下所有源文件加入到srcs变量中存储
  • add_library使用srcs变量中所有源文件进行构建,结果输出为src。不同于add_executable,add_library的构建的最终目标为动态链接库文件,而add_executable的构建结果为一个可执行文件。这里构建成动态链接库文件也是为了在根目录下构建时进行链接

扩展

在理解了多目录下CMakeLists的编写后,如果需要把源文件存放在多个不同目录中,也可以以动态链接库的形式分别进行构建、链接。而对于多级目录,也可以依次逐级构建并链接。

对于需要引用的外部动态链接库,也可以通过link_directories和target_link_libraries指令的配合进行引入。

同时本项目内使用了ninja作为构建工具,更方便了项目的构建,主要使用方法为

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