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)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体