在 CMake 中包含库的标头

vod*_*dan 8 c++ cmake

我的项目中有两个实用程序库。我正在寻找为库编写 CMake 配置的最佳方法。

/my_project
 --> CMakeLists.txt
 --> main.cpp
 --> /utils
      --> CMakeLists.txt
      --> common.h
      --> /base_c
           --> CMakeLists.txt
           --> base_c.c
           --> base_c.h
      --> /base_cpp
           --> CMakeLists.txt
           --> base_cpp.cpp
           --> base_cpp.hpp
Run Code Online (Sandbox Code Playgroud)

我当前的 CMake 文件:

/my_project/CMakeLists.txt

cmake_minimum_requared(VERSION 3.8)
project(my_project)

add_subdirectory(utils)

add_executable(main main.c)
target_link_libraries(main utils base_c base_cpp)
Run Code Online (Sandbox Code Playgroud)

/my_project/utils/CMakeLists.txt

add_subdirectory(base_c)
add_subdirectory(base_cpp)

add_library(utils)
target_sources(utils PUBLIC common.h)
Run Code Online (Sandbox Code Playgroud)

/my_project/utils/base_c/CMakeLists.txt

add_library(base_c base_c.c)
target_sources(base_c PUBLIC base_c.h)
Run Code Online (Sandbox Code Playgroud)

/my_project/utils/base_cpp/CMakeLists.txt

add_library(base_cpp base_cpp.cpp)
target_sources(base_cpp PUBLIC base_cpp.hpp)

find_library(BASEC base_c ../base_c)
target_link_libraries(base_cpp BASEC)
Run Code Online (Sandbox Code Playgroud)

问题是base_cpp没有找到包含来自base_c. 我应该如何修复配置?

我设法让它与 一起工作target_include_directories(base_cpp PRIVATE ../base_c),但根据INTERFACE_INCLUDE_DIRECTORIES 文档,这很丑陋,而且应该没有必要。

vod*_*dan 8

正如@Anedar 提到的,要解决这种情况,需要target_include_directories使用库中的PUBLIC或选项。它填充了库目标,由消费端使用。INTERFACECMakeLists.txtINTERFACE_INCLUDE_DIRECTORIEStarget_link_libraries

我的工作配置:

/my_project/CMakeLists.txt

cmake_minimum_requared(VERSION 3.8)
project(my_project)

add_subdirectory(utils)

add_executable(main main.c)
target_link_libraries(main utils base_c base_cpp)
Run Code Online (Sandbox Code Playgroud)

/my_project/utils/CMakeLists.txt

add_subdirectory(base_c)
add_subdirectory(base_cpp)

add_library(utils)
target_sources(utils PUBLIC common.h)
target_include_directories(utils INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
Run Code Online (Sandbox Code Playgroud)

/my_project/utils/base_c/CMakeLists.txt

add_library(base_c base_c.c)
target_sources(base_c PUBLIC base_c.h)
target_include_directories(base_c INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
Run Code Online (Sandbox Code Playgroud)

/my_project/utils/base_cpp/CMakeLists.txt

add_library(base_cpp base_cpp.cpp)
target_sources(base_cpp PUBLIC base_cpp.hpp)
target_include_directories(base_cpp INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

target_link_libraries(base_cpp base_c)
Run Code Online (Sandbox Code Playgroud)