找不到 CMake 静态库的依赖项
CMake Static library's dependency can't be found
我正在构建一个静态库并将其链接到我的可执行目标中。该库在真空中构建良好,但是当我尝试包含库中的标头时,我收到指向静态库依赖项的"无此类文件"错误。
我的理解是,我的静态库应该私下包含它的依赖项,消费者除了链接库之外不需要做任何事情。这有错吗?还是我只是不正确地包含静态库的依赖项?
CMakeLists.txt 对于静态库:
# Find SDL2 and associated libs
find_package(SDL2 REQUIRED)
find_package(SDL2_image REQUIRED)
find_package(SDL2_mixer REQUIRED)
find_package(SDL2_ttf REQUIRED)
# Build static library dependency SDL2pp
set(SDL2PP_WITH_IMAGE ON)
set(SDL2PP_WITH_MIXER ON)
set(SDL2PP_WITH_TTF ON)
add_subdirectory("${PROJECT_SOURCE_DIR}/../Libraries/libSDL2pp/"
"${CMAKE_CURRENT_BINARY_DIR}/Libraries/libSDL2pp/")
# Add our static library target
add_library(Framework_Game STATIC
Private/GameManager.cpp
Public/GameManager.h
)
target_include_directories(Framework_Game
PRIVATE
${SDL2_INCLUDE_DIRS} ${SDL2_IMAGE_INCLUDE_DIRS}
${SDL2_MIXER_INCLUDE_DIRS} ${SDL2_TTF_INCLUDE_DIRS}
${SDL2PP_INCLUDE_DIRS}
${CMAKE_CURRENT_SOURCE_DIR}/Private
PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/Public
)
target_link_libraries(Framework_Game
PRIVATE
${SDL2_LIBRARIES} ${SDL2_IMAGE_LIBRARIES}
${SDL2_MIXER_INCLUDE_DIRS} ${SDL2_TTF_INCLUDE_DIRS}
${SDL2PP_LIBRARIES}
)
CMakeLists.txt 对于可执行文件:
add_executable(NewWorlds Launch.cpp)
target_link_libraries(NewWorlds
PRIVATE
Framework_Game
)
GameManager.h 包含带有 #include <SDL2pp/SDL2pp.hh
的 SDL2pp。然后我将其包含在 Launch 中.cpp带有 #include <GameManager.h>
,这给出了错误SDL2pp/SDL2pp.hh: No such file or directory
您将 SDL2pp 依赖项设为私有Framework_Game
因此它不会根据Framework_Game
传播到目标。我不知道 SDL2pp 库,所以我无法确切地说出其中哪些需要公开,但是
target_include_directories(Framework_Game
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/Private
PUBLIC
${SDL2_INCLUDE_DIRS} ${SDL2_IMAGE_INCLUDE_DIRS}
${SDL2_MIXER_INCLUDE_DIRS} ${SDL2_TTF_INCLUDE_DIRS}
${SDL2PP_INCLUDE_DIRS}
${CMAKE_CURRENT_SOURCE_DIR}/Public
)
target_link_libraries(Framework_Game
PUBLIC
${SDL2_LIBRARIES} ${SDL2_IMAGE_LIBRARIES}
${SDL2_MIXER_INCLUDE_DIRS} ${SDL2_TTF_INCLUDE_DIRS}
${SDL2PP_LIBRARIES}
)
肯定会起作用。
我的理解是,我的静态库应该私下包含它的依赖项,消费者除了链接库之外不需要做任何事情。这有错吗?还是我只是不正确地包含静态库的依赖项?
这是一个设计决策,但是是的,这通常是很好的做法。但这意味着库的公共标头中不得包含任何 SDL 标头!那是你的工作。否则,正如Corristo所说,您需要传播依赖项。
相关文章:
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 通过ccmake在cmake中缓存依赖选项
- 如何在 CMake 中对目标依赖项进行分组?
- GCC,CMake,预编译标头和维护依赖项
- 如何使用现代 CMake 安装捆绑的接口依赖项?
- 使用 NuGet 填充 Visual Studio 2019 中的 CMake 依赖项
- 如何将外部依赖引入跨平台CMake项目?
- cmake 使用 find_package 传播依赖项
- 在 CMAKE 中使用具有静态依赖项的库
- CMake "安装" 目标及其 SO 依赖项
- 在现代 CMake 项目中存档静态依赖项
- 使用 cmake 获取外部依赖关系
- CMake 外部和内部静态库的循环依赖关系
- CMake将依赖项复制到可执行输出路径
- CMake-ing 项目与谷神星求解器时的特征依赖关系冲突
- CMake:如何添加不是"link"依赖项的依赖项
- CMake:如何在Visual Studio环境中将依赖于模式的编译标志传递给nvcc
- cmake:构建依赖于非源文件.Qt帮助生成
- 更改 Cmake 文件以从源代码编译依赖项,而不是使用 FIND_PACKAGE
- 设置库之间的依赖(CMake)