C++ CMake:构建并安装本地存储的子模块
关于堆栈溢出有许多类似的问题,但没有一个能接近于回答我的问题 我有一个使用CMAG:/P>构建的C++库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
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>
下面是我回顾过的一些堆栈溢出帖子的列表。我尝试了每种方法,但它们根本不起作用:
在库的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}