分类 CMake 下的文章

CMake:用add_subdirectory()添加外部项目文件夹


需求

正常情况下我们的项目各个子项目都在一个总的项目根目录下,但这次就需要使用外部的文件夹, 一个求解器文件夹(不动其代码),一个测试用例的相关项目,测试用例调用求解器内部代码进行相关测试。

处理过程

add_subdirectory命令,可以将指定的文件夹加到build任务列表中。下面是将与当前项目平级的一个目录下的子目录用add_subdirectory命令加进来的CMakelists.txt脚本片段 :

add_subdirectory(../test/test)

然后执行CMakeList.txt脚本时报错了:

屏幕截图 2022-06-13 114712.png

报错原因也很明确,因为要添加的这个文件夹不是当前项目的子目录。最后一句指明了方向:要指定一个外部的文件夹必须显式指定。
但怎么显式指定?
下面是add_subdirectory命令的官方说明:

官方文档

add_subdirectory有一个 binary_dir参数,这个参数用来指定source_dir在输出文件夹中的位置,如果没有指定的时候,就用source_dir的值。
如果要添加外部文件夹,binary_dir就必须指定。所以上面的代码修改如下:

add_subdirectory(../test/test test.out)

再执行CMakeList.txt正常通过,下图红框标出就是cassdk子目录下CMakeLists.txt的执行输出。


CMake: 包含子项目


要求

在当前项目中包含一个library库项目,并使用子项目的相关东西。

目录结构树

cmake_demo
├─ CMakeLists.txt
├─ domo.tree
├─ main.cpp
└─ sublibrary
   ├─ CMakeLists.txt
   ├─ sublibrary.cpp
   └─ sublibrary.h

过程

在main.cpp 中调用子目录内的sublibrary类内的东西,这样方便拓展,也方便迁移。比如sublibrary可直接拿到其他项目内调用。

代码

main 内的 CMakeLists.txt

cmake_minimum_required(VERSION 3.0.0)
project(cmake_demo VERSION 0.0.1 LANGUAGES CXX)

# 自动添加CMAKE_CURRENT_BINARY_DIR和CMAKE_CURRENT_SOURCE_DIR到当前处理的CMakeLists.txt
SET(CMAKE_INCLUDE_CURRENT_DIR ON)

# 添加子项目目录
add_subdirectory(sublibrary)

# 分别将h和cpp归至变量
FILE(GLOB SRC_HEADER "*.h")
FILE(GLOB SRC_SOURCE "*.cpp")

# 添加执行文件
add_executable(${PROJECT_NAME} ${SRC_HEADER} ${SRC_SOURCE})

# 自动包含目录
set_property(TARGET ${PROJECT_NAME} PROPERTY
    INTERFACE_INCLUDE_DIRECTORIES
    ${CMAKE_CURRENT_SOURCE_DIR}
)

# 链接子项目
target_link_libraries(${PROJECT_NAME} sublibrary)
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_BINARY_DIR})

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)

sublibrary 内的CMakeLists.txt

cmake_minimum_required(VERSION 3.0.0)
project(sublibrary VERSION 0.0.1 LANGUAGES CXX)

# 自动添加CMAKE_CURRENT_BINARY_DIR和CMAKE_CURRENT_SOURCE_DIR到当前处理的CMakeLists.txt
SET(CMAKE_INCLUDE_CURRENT_DIR ON)

SET(BUILD_SHARED_LIBS ON)

# 分别将h和cpp归至变量
FILE(GLOB SRC_HEADER "*.h")
FILE(GLOB SRC_SOURCE "*.cpp")

# 添加库文件
add_library(${PROJECT_NAME} SHARED ${SRC_HEADER} ${SRC_SOURCE})

# 自动包含目录
set_property(TARGET ${PROJECT_NAME} PROPERTY
    INTERFACE_INCLUDE_DIRECTORIES
    ${CMAKE_CURRENT_SOURCE_DIR}
)

target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_BINARY_DIR})

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)

CMake教程一: 介绍、安装、基本使用


CMake 介绍

CMake 是一种跨平台的免费开源软件工具,用于使用与编译器无关的方法来管理软件的构建过程。
通过编写CMakeLists.txt,可以控制生成的Makefile,从而控制编译过程。CMake自动生成的Makefile不仅可以通过make命令构建项目生成目标文件,还支持安装(make install)、测试安装的程序是否能正确执行(make test,或者ctest)、生成当前平台的安装包(make package)、生成源码包(make package_source)、产生Dashboard显示数据并上传等高级功能,只要在CMakeLists.txt中简单配置,就可以完成很多复杂的功能,包括写测试用例。
如果有嵌套目录,子目录下可以有自己的CMakeLists.txt。
CMake是一个非常强大的编译自动配置工具,支持各种平台,KDE也是用它编译的,感兴趣的可以试用一下。

安装

下载地址:CMake官网下载页面

Windows

下载地址:cmake-3.22.0-rc3-windows-x86_64.msi

linux

下载地址:cmake-3.22.0-rc3-linux-x86_64.tar.gz

基本使用

Windows

运行GUI的cmake界面:

微信图片编辑_20211118220355.jpg

Linux

待添加