【Learning CMake Cookbook】第一章--第一部分

CMakeLists基本

为hello-world.cpp单文件编译并生成可执行文件

cmake_minimum_required(VERSION 3.5 FATAL_ERROR)

指令用于指定cmake最低版本号,否则输出程序错误,停止CMake编译

project(PRJ_Name_Any LANGUAGES CXX)

指令用于指定工程文件名(工程名是任意的),并指出该工程用到的程序语言,这里CXX代表C++语言

add_executable(hello-world hello-world.cpp)

指令用于生成可执行文件,前者为可执行文件名,后者为生成可执行文件所需的源文件。当前工程较为简单,只有一个工程源文件,加入即可。

另外:我们还可以用以下的方式为可执行文件添加其所需要的源文件:

add_executable(hello-world) // 这里只定义可执行文件的名称

target_sources(hello-world
  PRIVATE // 先不对该字段进行解释
    hello-world.cpp
  )

关于PRIVATE字段的解释我们将会在【Learning CMake Cookbook】第一章–第三部分进行更详细的说明。

编译操作流程

为了不污染我们的代码,我们将编译生成的文件放到另一个文件夹下,一般在当前目录(CMakeLists存在的目录)下新建一个名为build的文件夹(一般都叫build但是其他也可以)。具体操作以及之后的编译流程如下:

$: mkdir build
$: cd build
$: cmake ..
$: cmake --build .

其中第三步、第四步将在当前目录的上层目录寻找名为CMakeLists的txt文件,找到后根据其中的指令对工程进行编译,最后将在build目录下生成可执行文件。

关于hello-world的多文件工程的编译

下面我们进入到一个稍微多一些文件的工程,描述如下:

  • 工程包括一个带有main函数的主文件hello-world.cpp
  • hello-world.cpp要包含Message.hpp,其中Message.hpp中的一些函数在Message.cpp中实现

可见这是一个多文件的工程,通过编辑CMakeLists.txt,我们有两种方法实现生成hello-world可执行文件:

  1. 直接使用源文件生成可执行文件
  2. 先为Message.cpp和Message.hpp生成相应的库文件,之后通过将可执行文件链接到库的位置生成可执行文件

直接生成可执行文件:

CMakeLists中使用以下的指令直接从源文件中得到一个可执行文件:

cmake_minimum_required(VERSION 3.5 FATAL_ERROR)

project(recipe-03 LANGUAGES CXX)

include_directories(.)
//包含路径,头文件将在这个路径下进行搜索 .代表当前目录(也可以不加)

add_executable( hello-world-no-lib 
                hello-world.cpp 
                Message.cpp)
//工程中所有涉及到的源文件都要包含在括号中,用空格进行间隔(或者换行符)

通过生成库,后与源文件链接的方式生成可执行文件

CMakeLists中使用以下的指令,先生成库,之后再生成可执行文件


cmake_minimum_required(VERSION 3.5 FATAL_ERROR)

project(recipe-03 LANGUAGES CXX)


add_library(message_static//这个是库的名称(和源码文件必须保持一致,但也不一定必须一致)
  STATIC//表示创建静态库,注意这里是创建
    Message.hpp
    Message.cpp
  )
//这里最终将生成一个lib+${库名称}的.a文件 (Linux下静态链接库的后缀名)
set_target_properties(message_static
  PROPERTIES
    OUTPUT_NAME "message"
)//通过这种方法可以生成同名的文件(但后缀不同)


add_library(message_shared//这个是库的名称(和源码文件必须保持一致,但也不一定必须一致)
  SHARED//表示创建静态库,注意这里是创建
    Message.hpp
    Message.cpp
  )
//这里最终将生成一个lib+${库名称}的.so文件 (Linux下动态链接库的后缀名)
set_target_properties(message_shared
  PROPERTIES
    OUTPUT_NAME "message"
)//通过这种方法可以生成同名的静态库和动态库文件(但后缀不同)

add_executable(hello-world hello-world.cpp)
//虽然是多文件工程,但这里只需要添加main函数所在的主源文件

target_link_libraries(hello-world message_shared)
//正是这句话将目标库链接到了可执行目标,我们可以选择链接动态库或者静态库,但注意一定要链接定义的库名,而非输出的OUTPUT_NAME后面的字符串!
//虽然之前生成的库的名字相同,但这里还是需要使用 add_library 的第一个参数命名的参数(保证一致)

//工程中所有涉及到的源文件都要包含在括号中,用空格进行间隔(或者换行符)

关于动态链接库以及静态链接库的区别在这里不进行详细的说明,之后会给出一个单独的link来进行加介绍。以下简要理解区别:
动态链接库:在可执行文件运行的时候也要进行动态加载,不然无法运行可执行文件
静态链接库:在编译的过程中,库中的代码就被加入了可执行文件,这会导致可执行文件占用空间比较大,但可执行文件在执行时与库便可以完全分离,没有依赖关系了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值