0

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

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

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

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

$ cd myapp/build
$ cmake ..
$ make

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

4

2 回答 2

1

假设在所描述的项目中,只有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/文件。文件 ininclude/可以使用 like#include <myfile.h>和 files in include/mylib(一般约定)可以使用 like #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将在之前构建myapptarget_link_libraries添加mylib到可执行文件中。

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

于 2019-03-19T18:28:52.240 回答
0

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

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

ADD_LIBRARY (${MyLibName} ${SOURCES})在图书馆的 CMakeLists.txt

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

其次,您将库添加到您的项目中

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

这将设置依赖链以强制 MyLibName 在 PROJECT_NAME 之前显式构建。

于 2019-03-13T21:10:24.413 回答