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/