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

时间:2019-03-13 20:46:05

标签: c++ cmake external-project

关于堆栈溢出有很多类似的问题,但是没有一个可以回答我的问题。

我有一个使用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

并且希望像这样在mylib中使用myapp。请注意如何将mylib标头包含在格式如下的目录中:

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

mylib应该在构建myapp时构建,以便以下内容能够在没有任何其他构建步骤的情况下正常工作 :

$ cd myapp/build
$ cmake ..
$ make

这里是我已查看过的一些Stack Overflow帖子的列表。我尝试了每种方法,但它们根本不起作用:

2 个答案:

答案 0 :(得分:0)

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

首先,该库需要使用ADD_LIBRARY()构建,但我假设您要这样做。

库的CMakeLists.txt中的

ADD_LIBRARY (${MyLibName} ${SOURCES})

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

第二,使用

将库添加到项目中

target_link_libraries (${PROJECT_NAME} ${MyLibName})在可执行文件的CMakeLists.txt中,与您放置add_executable (${PROJECT_NAME} ${SOURCES})

的文件相同

这将建立依赖关系链,以强制MyLibName在PROJECT_NAME之前显式构建。

答案 1 :(得分:0)

假设在描述的项目中,仅将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_librariesmylib添加到可执行文件中。

如Tzalumen所言,请确保您对CMake tutorials有所了解,并偏爱使用cmake --build .而不是make