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 @ 2024-07-02 16:07  溪嘉嘉  阅读(10)  评论(0编辑  收藏  举报