【发布时间】:2021-07-03 16:25:16
【问题描述】:
首先,我不确定我设置项目的方式是否正确,但就是这样,
一个名为 Lib 的 cmake 项目有两个子目录 Animal 和 Dog。两者都是静态库,但 Dog 依赖于 Animal。
Lib 的 CMakeLists.txt
cmake_minimum_required(VERSION 3.16.3)
project(Lib VERSION 1.0.0 DESCRIPTION "My package." LANGUAGES CXX)
add_subdirectory(Animal)
add_subdirectory(Dog)
install(EXPORT LibConfig
FILE LibConfig.cmake
NAMESPACE Lib::
DESTINATION lib/Lib/cmake
)
动物/CmakeLists.txt
set(TARGET_NAME Animal)
add_library(${TARGET_NAME}
src/Animal.cpp
)
target_include_directories(${TARGET_NAME} PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
install(TARGETS ${TARGET_NAME} EXPORT LibConfig
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin
)
install(DIRECTORY include/
DESTINATION include/${TARGET_NAME}
FILES_MATCHING PATTERN "*.hpp")
狗/CMakeLists.txt。我不确定如何依赖 Animal。
set(TARGET_NAME Dog)
add_library(${TARGET_NAME}
src/Dog.cpp
)
target_include_directories(${TARGET_NAME}
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
PRIVATE
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/Animal/include>
)
target_link_libraries(${TARGET_NAME}
PRIVATE
Animal
)
install(TARGETS ${TARGET_NAME} EXPORT LibConfig
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin
)
install(DIRECTORY include/
DESTINATION include/${TARGET_NAME}
FILES_MATCHING PATTERN "*.hpp")
这使用了库。
cmake_minimum_required(VERSION 3.10.2)
project(UseLib)
find_package(Lib REQUIRED)
add_executable(${PROJECT_NAME}
main.cpp
)
target_link_libraries(${PROJECT_NAME}
Lib::Dog
)
main.cpp
#include <Dog/Dog.hpp>
int main()
{
Dog d;
return 0;
}
这些库编译得很好,但是当我在项目中使用它时,我收到一条错误消息,说 Dog 找不到 Animal 标头。
.../include/Dog/Dog.hpp:3:10: fatal error: Animal.hpp: No such file or directory
#include "Animal.hpp"
^~~~~~~~~~~~
compilation terminated.
make[2]: *** [CMakeFiles/UseLib.dir/build.make:63: CMakeFiles/UseLib.dir/main.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:76: CMakeFiles/UseLib.dir/all] Error 2
make: *** [Makefile:84: all] Error 2
【问题讨论】:
-
为什么要执行
PRIVATE链接-target_link_libraries(${TARGET_NAME} PRIVATE Animal)-如果Animal.hpp实际上包含在Dog库的接口 中? (库Dog具有接口头Dog.hpp。由于该头包含Animal.hpp,因此Animal.hpp也是Dog的接口。)请改用PUBLIC链接。
标签: cmake