パッケージパスを保持するcmake変数を見つける方法

パッケージパスを保持するcmake変数を見つける方法

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::SDLFind_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

関連情報