cmake的使用

发布时间 2023-12-18 11:33:13作者: zxinlog

cmake

简介

cmake 是一个软件自动化构建工具,在使用C/C++ 编写程序的时候,多个源文件编译一般是通过makefile 工具进行编译生成。可以通过使用cmake 生成一个 makefile文件,再通过 makefile文件生成程序。

简而言之:cmake 用于生成 makefile文件,makefile 文件用于编译源文件生成程序。

在没有cmake 之前,makefile 也可以自己写。

但既然有了cmake,就没有必要再自己写makefile文件了(但对makefile文件仍然要有了解和认识)

CMakeLists.txt

CMakeLists.txt 文件是构建cmake 的核心,配置信息,加载源文件都在其中编写。

一般在文件中首先指定cmake的最低版本。

cmake_minimum_required(VERSION 2.8)

常见参数:

  • project(name) 定义项目名称
  • add_executable(target_name file1.cc file2.cc ) 指定要编译的源文件和生成的可执行文件
  • add_library(target_name STATIC/SHARED file1.cc file2.cc) 生成库文件(静态/动态)
  • find_package(package_name) 查找并使用一个外部库
  • include_directories(dir1 dir2) 指定头文件的搜索路径
  • target_link_libraries(target_name lib1 lib2) 指定链接时需要的库
  • set(variable value) 设置一个变量

示例

比如,我当前有多个源文件,分别为:a.cc, b.cc, c.cc,那么我的CMakeLists.txt 就可以这样写

cmake_minimum_required(VERSION 2.8)
project(out) # 这里的out表示这个工程的名字,默认和变量 PROJECT_NAME 一致。
# 在这里定义project之后,就可以使用 PROJECT_NAME 这个变量。
add_executable(a.out a.cc b.cc c.cc) # 这里的a.out表示即将生成的可执行程序

可以通过set设置一些变量,在文件中使用 ${} 使用变量的值。

set(target_name  "a.out") 
add_executable(${target_name} a.cc b.cc c.cc)

动态库

主要谈谈动态库和静态库的使用和区别。静态库在linux下一般时 .a 结尾的库,如 libxx.a ,这个xx就是这个静态库的名字。动态库一般以 .so 结尾。如 libxxx.so ,这个xxx就是动态库的名字,这是linux下库的命名规范。静态库一般放在 lib 目录下,在使用的时候,通过 -l 链接静态库或动态库,链接方式都是一样的。

区别在于,静态库链接之后,静态库中的二进制内容就一起被打包成一个可执行文件,即使将静态库删除,也不会影响可执行文件的使用。

静态库则更类似于告诉可执行程序:你在执行的时候,去链接这个动态库。也就是说,之后的每次可执行程序执行,都会自动链接该动态库,这个动态库不能删除,如果删除,可执行程序中涉及到该库的内容就不能使用。

生成动态库和静态库的方式不同。在Cmake中可以直接通过设定

add_library(生成库名字 SHARED/STATIC xxx.cpp xxx.cpp)

# 生成库的名字是即将生成的动态库或静态库名字。
# SHARED表示动态库,shared。
# STATIC表示静态库,static
# xxx.cpp 表示源文件