CMake基础使用整理

2020-06-24  本文已影响0人  子衿我心

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++)

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

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

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

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

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

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

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

这里的内容就非常简单

扩展

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

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

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

cd cmake-build-debug
cmake -G Ninja ..     //cmake支持根据CMakeLists.txt自动化生成ninja构建所需要的ninja.build等文件
ninja                 //在该目录下构建
上一篇下一篇

猜你喜欢

热点阅读