Digamos que usei find_package(SDL REQUIRED) agora preciso vincular essa biblioteca através de target_link_libraries qual seria o nome da variável a passar para target_link_libraries? Em geral, existe uma maneira de encontrar essas variáveis além de adivinhar heuristicamente? Eu tentei SDL_LIBRARY, SDL2_LIBRARY e SDL_LIBRARIES. Eu tenho o sdl2 instalado.
Eu esperava que isso funcionasse, mas não funcionou:
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 Error at
> /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!
Geralmente é
<MODULENAME>_LIBRARIES
, e esse também é o caso do SDL.Mas isso é apenas uma convenção, talvez você precise ler o respectivo
find_<MODULENAME>.cmake
script (geralmente em locais como /usr/share/cmake/Modules, /usr/lib/cmake/version/Modules ou parte da árvore de origem). Infelizmente, especialmente em relação à hifenização, letras maiúsculas e outras nuances de nomenclatura, é um faroeste com esses módulos CMake. Você obtém uma boa documentação dos autores da biblioteca ou precisa ler o arquivofind_<MODULENAME>.cmake
.Além disso, não que você provavelmente não deva usar a forma herdada de usar bibliotecas no CMake. Em vez de seu
você deve apenas usar o moderno CMake , o que facilita as coisas. Se você precisava apenas de SDL2 (não de SDL2_image), então toda a sua descoberta e uso se tornaria isto:
Você não precisa definir os diretórios de inclusão, eles são definidos automaticamente porque você vincula seu destino ao destino
SDL::SDL
exportado porFind_SDL.cmake
.No entanto, você precisa
SDL2_image
(tem certeza? Achei que já fazia parte do SDL, mas posso estar enganado), e isso não tem recebido muito amor, então precisamos fazer nós mesmos a configuração moderna do CMake. A vantagem é que fazemos isso uma vez e, a partir daí, podemos sempre usar o alvo que configuramos uma vez e não precisamos mexer emtarget_include_…
nada.É isso; não há necessidade de lembrar vários nomes de variáveis, apenas o nome dos alvos aos quais você vincula:
SDL::SDL
e o nosso próprioSDL::image
.