我的项目中有两个实用程序库。我正在寻找为库编写 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 文档,这很丑陋,而且应该没有必要。
正如@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)