find_package(SDL REQUIRED)를 사용했다고 가정합니다. 이제 target_link_libraries를 통해 라이브러리에 연결해야 합니다. target_link_libraries에 전달할 변수 이름은 무엇입니까? 일반적으로 경험적 추측 외에 이러한 변수를 찾는 다른 방법이 있습니까? SDL_LIBRARY, SDL2_LIBRARY 및 SDL_LIBRARIES를 사용해 보았습니다. sdl2가 설치되어 있었습니다.
나는 이것이 효과가 있을 것이라고 생각했지만 그렇지 않았습니다.
cmake_minimum_required(VERSION 3.10)
project(someProject)
# Find SDL2
find_package(SDL REQUIRED)
find_package(SDL_image REQUIRED)
# Include directories
include_directories(${SDL2_INCLUDE_DIRS} ${SDL2_IMAGE_INCLUDE_DIRS})
# Set source files
set(SOURCES main.cpp)
# Set executable
add_executable(someProject ${SOURCES})
# Link libraries
target_link_libraries(someProject ${SDL2_LIBRARIES} ${SDL2_IMAGE_LIBRARIES})
알겠어요
CMake 오류는 다음 위치에 있습니다.
/usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:230
(message):
Could NOT find SDL (missing: SDL_LIBRARY SDL_INCLUDE_DIR)
Call Stack (most recent call first):
/usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:600 (_FPHSA_FAILURE_MESSAGE)
/usr/share/cmake/Modules/FindSDL.cmake:224 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
CMakeLists.txt:5 (find_package)
-- Configuring incomplete, errors occurred!
답변1
그것은대개 <MODULENAME>_LIBRARIES
, SDL의 경우에도 마찬가지입니다.
find_<MODULENAME>.cmake
그러나 이는 단지 관례일 뿐이므로 해당 스크립트(보통 /usr/share/cmake/Modules, /usr/lib/cmake/version/Modules 또는 소스 트리의 일부 등)를 읽어야 할 수도 있습니다 . 불행하게도 이러한 CMake 모듈은 특히 하이픈, 대문자 및 기타 명명 뉘앙스와 관련하여 와일드 웨스트입니다. 라이브러리 작성자가 제공한 좋은 문서가 있거나 이를 읽어야 합니다 find_<MODULENAME>.cmake
.
CMake에서 라이브러리를 사용하는 기존 방식을 사용해서는 안 된다는 것이 아닙니다. 너의 것보다는
# Find SDL2
find_package(SDL REQUIRED)
find_package(SDL_image REQUIRED)
# Include directories
include_directories(${SDL2_INCLUDE_DIRS} ${SDL2_IMAGE_INCLUDE_DIRS})
# Set source files
set(SOURCES main.cpp)
# Set executable
add_executable(someProject ${SOURCES})
# Link libraries
target_link_libraries(someProject ${SDL2_LIBRARIES} ${SDL2_IMAGE_LIBRARIES})
당신은 사용해야합니다최신 CMake, 일이 간단해집니다. SDL2_image가 아닌 SDL2만 필요한 경우 전체 검색 및 사용법은 다음과 같습니다.
# Find SDL2, which has modern CMake bindings
find_package(SDL REQUIRED)
# Set executable
add_executable(someProject main.cpp)
# Link libraries (I assume you want PRIVATE here, `someProject` is not supposed to export SDL targets/symbols)
target_link_libraries(someProject PRIVATE SDL::SDL)
포함 디렉터리를 직접 설정할 필요는 없으며 대상 SDL::SDL
을 Find_SDL.cmake
.
하지만 SDL2_image
(확실합니까? 지금은 SDL의 일부라고 생각하지만 틀릴 수도 있습니다.) 이는 많은 사랑을 받지 못하므로 최신 CMake 설정을 직접 수행해야 합니다. 장점은 이 작업을 한 번만 수행하고 그 이후로는 조작할 필요 없이 항상 한 번 설정한 목표를 사용할 수 있다는 것입니다 target_include_…
.
# Find SDL2, which has modern CMake bindings
find_package(SDL REQUIRED)
# SDL_image is legacy, so that's annoying, we have to fix things ourselves:
find_package(SDL_image REQUIRED)
if(NOT TARGET SDL::image)
add_library(SDL::image INTERFACE IMPORTED)
set_target_properties(SDL::image PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${SDL_IMAGE_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${SDL_IMAGE_LIBRARIES}")
endif()
# Set executable
add_executable(someProject main.cpp)
# Link libraries
target_link_libraries(someProject PRIVATE SDL::SDL SDL::image)
SDL::SDL
그게 다 입니다. 여러 변수 이름을 기억할 필요가 없으며 링크 대상의 이름만 기억하면 됩니다 SDL::image
.