【发布时间】:2021-05-17 18:48:35
【问题描述】:
我有一个使用 CMAKE 的项目,需要链接 SDL2。我试图了解 find_package 是如何工作的。在过去的某个时刻,我能够通过提供我自己的 FindSDL2.cmake 来让 find_package 工作,但是在出现一些新的链接器错误之后,我决定尝试一种不同的方法。我正在做的阅读似乎暗示,在我安装了 libsdl2-dev 包之后,我应该能够只使用 find_package(SDL2 REQUIRED) 然后 target_link_libraries(Suqua PRIVATE SDL2::SDL2),但是 cmake 会抛出一个找不到包错误。我需要提供自定义 FindSDL2.cmake 吗?
CMakeLists.txt
cmake_minimum_required (VERSION 3.8)
set(CMAKE_CXX_STANDARD 17)
find_package(SDL2 CONFIG REQUIRED)
file(GLOB source_files
"src/*.cpp"
"header/*.h"
)
add_library(Suqua ${source_files} "src/glad.c" )
target_include_directories(Suqua PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/header)
target_include_directories(Suqua PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../include)
target_link_libraries(Suqua PRIVATE SDL2::SDL2 enet)
if(UNIX)
target_link_libraries(Suqua PRIVATE stdc++fs)
endif()
错误
CMake Error at Suqua/CMakeLists.txt:13 (add_library):
Target "Suqua" links to target "SDL2::SDL2" but the target was not found.
Perhaps a find_package() call is missing for an IMPORTED target, or an
ALIAS target is missing?
谢谢,如果您对我的 CMakeLists 有任何其他批评,我们将不胜感激!
【问题讨论】:
-
使用
find_package提供提示 - 请参见此处的示例 - stackoverflow.com/a/64337995/1607937 -
GLOBbing 现在已被弃用,加上 3.8 现在是一个相当老的 min-vers。在开头附近还应该有一个
project声明。我建议购买 Craig Scott 的书“Professional CMake”-crascit.com -
"cmake throws a package not found error" - 不,这是对 CMake 输出的错误解释。
find_package调用已成功。问题在于 call 没有像预期的那样定义SDL2::SDL2目标。 -
@Den-Jason 要么我做错了,要么没有运气。 find_package(SDL2 REQUIRED HINTS /usr/lib/x86-64-linux-gnu/) 感谢本书的推荐!我去拿一份。
-
@Tsyvarev 所以它找到了包,但没有定义目标?这是怎么回事?调试输出当然没有包含任何关于无法找到包的信息。