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

C++ CMake:构建并安装本地存储的子模块,c++,cmake,external-project,C++,Cmake,External Project,关于堆栈溢出有许多类似的问题,但没有一个能接近于回答我的问题 我有一个使用CMAG:/P>构建的C++库 mylib | - CMakeLists.txt | - src/ | | - m.h | | - m.cpp | - include/ | | - mylib/ | | | - a.h | | | - something/ | | | | - some.h | - cmake/ | - mylibConfig.cmake.in | - myl

关于堆栈溢出有许多类似的问题,但没有一个能接近于回答我的问题

我有一个使用CMAG:/P>构建的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
头是如何包含在类似目录的格式中的:

#include <mylib/a.h>
#include <mylib/something/some.h>
下面是我回顾过的一些堆栈溢出帖子的列表。我尝试了每种方法,但它们根本不起作用:


所以,我实际上是在我的一个项目中这样做的

首先,需要使用ADD_library()构建库,但我假设您会这样做。差不多

在库的CMakeLists.txt中添加库(${MyLibName}${SOURCES})

这会将库添加到cmake的库列表中

第二,使用以下命令将库添加到项目中:

target\u link\u库(${PROJECT\u NAME}${MyLibName})
在可执行文件的CMakeLists.txt中,与添加可执行文件(${PROJECT\u NAME}${SOURCES})的位置相同。


这将设置依赖链,强制MyLibName在项目名称之前显式生成。

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

mylib
的顶级
CMakeLists.txt
需要包含:

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
)
使用
add_子目录
可确保在
myapp
target_link_库
mylib
添加到可执行文件之前构建
mylib


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

这些问题似乎是关于外部项目的,而您的项目具有内部库(即它位于应用程序项目的目录树中)所以我想
add_子目录
应该足够了。但我个人反对这样的项目组织。我非常喜欢
cmake--build.
而不是
make
,它更便于移植。我希望整个过程都能一次完成。我不想将
mylib
myapp
分开制作和构建。该项目需要110%的自包含性。当我说它首先做到这一点时,我指的是单个构建的编译顺序。我的项目构建了一个配置调用和一个构建调用。具体地说,它制作一个
\u build
目录,
cd
s进入目录,调用
cmake..
,然后调用
cmake--build.
,我只是坐下来等待编译完成。@paddycakes我很抱歉,如果我没有完全弄清楚,这个答案是标准的,构建库并将其添加到项目中的正确方法,我直接从cmake文档中了解到。我已经完成了教程,但我希望对每一行的用途进行进一步阐述。我发现我的问题是没有正确地使用
target\u include\u目录将include目录添加到
mylib
。我添加了一个包罗万象的答案。
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}