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目录下生成可执行文件。
下面我们进入到一个稍微多一些文件的工程,描述如下:
可见这是一个多文件的工程,通过编辑CMakeLists.txt,我们有两种方法实现生成hello-world可执行文件:
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来进行加介绍。以下简要理解区别:
动态链接库:在可执行文件运行的时候也要进行动态加载,不然无法运行可执行文件
静态链接库:在编译的过程中,库中的代码就被加入了可执行文件,这会导致可执行文件占用空间比较大,但可执行文件在执行时与库便可以完全分离,没有依赖关系了。