2 votes

comment puis-je dire à cmake de trouver Windows Media Foundation ?

Pour que cmake crée un lien vers (par exemple) boost::thread Je sais écrire :

find_package(Boost REQUIRED COMPONENTS thread)

et ensuite :

target_link_librarie(${target}
    PRIVATE
    Boost::thread
)

Comment faire avec les bibliothèques de la Fondation Windows Media ?

1voto

ComicSansMS Points 12749

Il y a trois façons fondamentales de gérer les dépendances avec CMake :

CMake est livré avec un un tas de modules find pour trouver des bibliothèques externes . Votre appel à find_package(Boost ...) est géré par le FindBoost module.

Alternativement, votre dépendance peut être livrée avec un fichier config script que l'on peut trouver par find_package . C'est l'approche qui est utilisée pour trouver par exemple Qt5.

Dans votre cas, malheureusement, aucun de ces cas ne s'applique, ce qui nous laisse la dernière option restante : Écrire votre propre script de recherche ! Vous pouvez jeter un coup d'oeil à le code source de certains des modules fournis avec CMake à titre d'exemple. L'exemple de Boost est assez compliqué, mais FindVulkan par exemple, est raisonnablement simple.

Vous avez principalement besoin d'un find_path pour le chemin d'inclusion et un find_library appel à la .lib fichier. Le site Page MSDN pour la Fondation Windows Media vous indique ce que vous devez rechercher. Si vous avez de la chance, le programme d'installation du SDK a défini une variable d'environnement que vous pouvez utiliser comme indice pour l'option find_* dans ce cas, votre script sera entièrement automatique. Sinon, vous devrez spécifier manuellement l'emplacement lors de l'exécution de CMake.

Si cette approche peut sembler lourde, elle est très souple et permet de gérer tout type de dépendance vis-à-vis de tiers. Si vous voulez sortir du domaine de CMake pur, vous pouvez également jeter un coup d'oeil aux gestionnaires de paquets comme vcpkg o conan pour la gestion des dépendances, qui offrent des fonctionnalités et un confort supplémentaires.

0voto

dmedine Points 304

@ComicSansMS, je n'ai pas vu WMF sur la liste. Ce que j'ai fait pour résoudre ce problème est le suivant.

set(wmf_libs dxva2.lib evr.lib mf.lib mfplat.lib mfplay.lib mfreadwrite.lib mfuuid.lib)

target_link_libraries(${target}
    PRIVATE
    ${wmf_libs}
)

Je savais depuis le début que cela ferait l'affaire (Windows est au moins assez sage pour savoir où se trouvent ses propres bibliothèques, donc aucun chemin n'a besoin d'être découvert), mais je voulais savoir s'il y avait une façon de faire plus correcte du point de vue CMake/stylistique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X