c++ - CMake:构建并安装本地存储的子模块

标签 c++ cmake external-project

Stack Overflow 上有很多类似的问题,但没有一个能回答我的问题。

我有一个使用 CMake 构建的 C++ 库:

mylib
| - CMakeLists.txt
| - src/
|   | - m.h
|   | - m.cpp
| - include/
|   | - mylib/
|   |   | - a.h
|   |   | - something/
|   |   |   | - some.h
| - cmake/
|   - mylibConfig.cmake.in
|   - mylibConfigVersion.cmake.in

然后我创建另一个库或可执行文件,其中包含上述库:

myapp
| - CMakeLists.txt
| - src/
|   | - main.cpp
| - include/
|   | - myapp/
|   |   | - b.h
| - libs
|   | - mylib

并且想像这样在 myapp 中使用 mylib 。请注意 mylib header 如何包含在类似格式的目录中:

#include <mylib/a.h>
#include <mylib/something/some.h>

mylib 应在构建 myapp 时构建,以便以下工作无需任何其他构建步骤:

$ cd myapp/build
$ cmake ..
$ make

以下是我审阅过的一些 Stack Overflow 帖子的列表。我已经尝试过每一个,但它们根本不起作用:

最佳答案

假设在所描述的项目中,只有mylib/include中的头文件目录被视为公开:

顶级CMakeLists.txt对于 mylib需要包含:

cmake_minimum_required(VERSION 3.13 FATAL_ERROR)
project(mylib VERSION 0.1 LANGUAGES CXX)

add_library(${MyLibName} ${MyLib_SOURCES})

target_include_directories(${MyLibName}
    PUBLIC
        $<INSTALL_INTERFACE:include>
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/src
)

这可确保项目包括 mylib只能访问 include/ 中的文件目录。文件位于include/可以像#include <myfile.h>一样使用和文件 include/mylib (一般约定)可以像#include <mylib/myfile.h>一样使用.

顶级CMakeLists.txt对于 myapp应包括:

cmake_minimum_required(VERSION 3.13 FATAL_ERROR)
project(myapp VERSION 0.1 LANGUAGES CXX)

add_subdirectory(libs/mylib)

add_executable(${MyAppName} ${MyApp_SOURCES})
target_link_libraries(${MyAppName} ${MyLibName}

使用add_subdirectory确保mylib将在myapp之前构建和target_link_libraries添加mylib到可执行文件。

正如 Tzalumen 所提到的,请务必查看 CMake tutorials并更喜欢使用cmake --build .而不是make .

关于c++ - CMake:构建并安装本地存储的子模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55150944/

相关文章:

c++ - TreeListView 控件

makefile - 使 'make clean' 请求确认

Android JNI CMAKE : member reference type 'JNIEnv' (aka '_JNIEnv' ) is not a pointer

c++ - 将使用 ExternalProject_Add 构建的库链接到使用 CMAKE_CXX_COMPILER 配置的项目时出错

cmake - 如何使用 HTTPS URL 请求 GIT_REPOSITORY 的密码

c++ - 我可以捆绑两个 MPI 消息吗?

c++ - 如何从模板中的对象 vector 上获取迭代器?

c++ - 二叉搜索树中的节点拒绝删除

CMake:文件复制不会覆盖现有文件