Zunächst der Anruf:
include(FindPkgConfig)
sollte ersetzt werden durch:
find_package(PkgConfig)
Der find_package()Anruf ist flexibler und ermöglicht Optionen wie REQUIRED, die Dinge automatisch erledigen, mit denen man manuell arbeiten müsste include().
Zweitens sollte ein manueller Anruf pkg-confignach Möglichkeit vermieden werden. CMake enthält eine Reihe von Paketdefinitionen, die unter Linux unter zu finden sind /usr/share/cmake-3.0/Modules/Find*cmake. Diese bieten dem Benutzer mehr Optionen und Auswahlmöglichkeiten als ein roher Anruf an pkg_search_module().
Was den erwähnten hypothetischen target_use()Befehl betrifft, hat CMake diesen bereits in gewisser Weise mit PUBLIC | PRIVATE | INTERFACE eingebaut. Ein Aufruf wie target_include_directories(mytarget PUBLIC ...)bewirkt, dass die Include-Verzeichnisse automatisch in jedem Ziel verwendet werden mytarget, das z target_link_libraries(myapp mytarget). Dieser Mechanismus scheint jedoch nur für Bibliotheken zu gelten, die in der CMakeLists.txtDatei erstellt wurden, und funktioniert nicht für Bibliotheken, die mit erworben wurden pkg_search_module(). Der Anruf add_library(bar SHARED IMPORTED)könnte dafür verwendet werden, aber ich habe das noch nicht untersucht.
Die Hauptfrage funktioniert hier in den meisten Fällen:
find_package(PkgConfig REQUIRED)
pkg_check_modules(SDL2 REQUIRED sdl2)
...
target_link_libraries(testapp ${SDL2_LIBRARIES})
target_include_directories(testapp PUBLIC ${SDL2_INCLUDE_DIRS})
target_compile_options(testapp PUBLIC ${SDL2_CFLAGS_OTHER})
Das SDL2_CFLAGS_OTHERenthält Definitionen und andere Flags, die für eine erfolgreiche Kompilierung erforderlich sind. Die Flaggen SDL2_LIBRARY_DIRSund SDL2_LDFLAGS_OTHERsind aber immer noch ignoriert, keine Ahnung , wie oft , dass ein Problem werden würde.
Weitere Dokumentation hier http://www.cmake.org/cmake/help/v3.0/module/FindPkgConfig.html
IMPORTED_TARGETerfordert CMake 3.6 oder neuer.