CMake的基本用法

单个源文件构建

在源文件所在的文件夹中,新建名为:

CMakeLists.txt

 的文件,并在其中键入如下内容:

# 设置项目所需的最低CMake版本
cmake_minimum_required(VERSION 2.8)

# 设置项目名称,并将其存储在变量PROJECT_NAME中
project(test)

# 使用指定的源文件向项目添加可执行文件
add_executable(main main.cpp)

在源文件所在目录下,执行命令:

cmake .

来生成构建系统,

则文件夹中会出现包含Makefile在内的一系列文件:

此时,再执行:

cmake --build .

make

命令,则可生成可执行文件,如下图:

但是,此种方式生成的构建系统相关文件,会保存在源代码所在的目录下,这些文件会与源代码混在一起。为了方便管理,通常新建一个名为build的文件夹,用来保存构建系统相关文件,即:

mkdir build

然后进入build目录下:

cd build

依次执行:

cmake ../.
cmake --build .

从而生成构建系统并构建项目。值得注意的是,为了使生成的构建系统相关文件在build目录下,所以要先进入build目录下;而在执行cmake命令时,给出的路径应指向CMakeLIsts.txt所在目录,此处通过../.来实现。后面的构建命令则在包含构建系统相关文件的build目录下执行。

包含头文件和源文件的项目构建

项目目录如下:

其中,头文件在include文件夹中,源文件在src文件夹中,则构建项目所需的CMakeLists.txt内容如下:

复制代码
# 设置项目所需的最低CMake版本
cmake_minimum_required(VERSION 2.8)

# 设置项目名称,并将其存储在变量PROJECT_NAME中
project(test)

# 将包含目录添加到构建中
include_directories(include)

# 使用指定的源文件向项目添加可执行文件
add_executable(main src/main.cpp src/test.cpp)
复制代码

此处,构建所需的源文件除通过相对路径的方式逐个添加,还可以使用SRC变量指向src目录中的源文件,从而用SRC变量代替逐个列出的源文件:

复制代码
# 设置项目所需的最低CMake版本
cmake_minimum_required(VERSION 2.8)

# 设置项目名称,并将其存储在变量PROJECT_NAME中
project(test)

# 将包含目录添加到构建中
include_directories(include)

# 用SRC变量指向src目录中的源文件
aux_source_directory(src SRC)

# 使用指定的源文件向项目添加可执行文件
# add_executable(main src/main.cpp src/test.cpp)
add_executable(main ${SRC}) # 使用SRC变量代替逐个列出源文件
复制代码

库的构建

使用add_library配合STATIC参数生成静态链接库:

add_library(test STATIC src/test.cpp)

或配合SHARED参数生成动态链接库:

add_library(test SHARED src/test.cpp)

若二者同时运行,应使库名各不相同,否则引发冲突。

此时,生成的库在build路径下。可通过set命令指定生成的库的路径:

set(LIBRARY_OUTPUT_PATH ../lib)

或:

set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../lib)

其中,${PROJECT_BINARY_DIR}指代构建系统相关文件(如CMakeFiles、Makefile等)所在目录,或用:

set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

其中,${PROJECT_SOURCE_DIR}指代顶层(最外层而非子文件夹中)CMakeLists.txt所在目录。

包含库的项目构建

当构建库的命令与链接库的命令在同一个CMakeLists.txt文件中时,可直接在生成可执文件的命令后,通过target_link_libraries命令链接库:

复制代码
cmake_minimum_required(VERSION 2.8)

project(test)

include_directories(include)

add_library(test STATIC src/test.cpp)

add_executable(main src/main.cpp)

target_link_libraries(main test)
复制代码

但若二者不在同个CMakeLists.txt文件中,即库文件并非通过此CMakeLists.txt生成,需要指出库的绝对路径及全名:

target_link_libraries(main ${PROJECT_BINARY_DIR}/libtest.a)

而不可直接使用test。

上述内容中,库文件均生成在build目录下。当将库文件指定生成在lib目录下时,若通过CMakeLists.txt同时生成,仍无需指定库的绝对路径及全名。当库文件为第三方库或预先生成的,且在lib目录下,则需要通过:

link_directories(${PROJECT_SOURCE_DIR}/lib)

来指定链接的库所在的路径,且此命令必须在生成可执行文件命令之前;而链接库的命令target_link_libraries则需要在生成可执行文件命令之后:

复制代码
cmake_minimum_required(VERSION 2.8)

project(test)

include_directories(include)

link_directories(${PROJECT_SOURCE_DIR}/lib)

add_executable(main src/main.cpp)

target_link_libraries(main test)
复制代码

下面综合运用上文涉及的命令给出一个参考示例:

复制代码
# 设置项目所需的最低CMake版本
cmake_minimum_required(VERSION 2.8)

# 设置项目名称,并将其存储在变量PROJECT_NAME中
project(test)

# 将包含目录添加到构建中
include_directories(include)

# 生成静态库
add_library(test STATIC src/test.cpp)
# 或生成动态库
# add_library(test SHARED src/test.cpp)

# 设置生成库输出到的目录
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
# 另一种方式
# set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../lib)

# 链接库目录
link_directories(${PROJECT_SOURCE_DIR}/lib)

# 使用指定的源文件向项目添加可执行文件
add_executable(main src/main.cpp)
# 或
# aux_source_directory(src SRC)
# add_executable(main ${SRC})

# 链接库
target_link_libraries(main test)
复制代码

 

posted @   溪嘉嘉  阅读(87)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体
点击右上角即可分享
微信分享提示