如何告诉CMake找到Windows Media Foundation?

3
为了让cmake链接到(例如)boost::thread,我可以这样写:
find_package(Boost REQUIRED COMPONENTS thread)

然后:

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

我该如何使用Windows Media Foundation库来实现这一点?
2个回答

1

CMake有三种基本的处理依赖关系的方式:

CMake内置了一些用于查找外部库的查找模块。您对find_package(Boost ...)的调用由FindBoost模块处理。

或者,您的依赖项可能会附带一个配置脚本,可以通过find_package找到。这是用于查找例如Qt5的方法。

在您的情况下,不幸的是,这些都不适用,只剩下最后一个选择:编写自己的查找脚本!您可以参考CMake随附的一些模块的源代码作为示例。Boost模块非常复杂,但FindVulkan相对简单。

您主要需要使用find_path调用来包含路径,以及使用find_library调用来查找.lib文件。Windows Media Foundation的MSDN页面会告诉您要搜索什么内容。如果您很幸运,SDK安装程序会设置一个环境变量,您可以将其用作find_*调用的提示,这样您的脚本将完全自动化。如果没有设置环境变量,则在运行CMake时必须手动指定位置。

虽然这种方法可能看起来有些繁琐,但它非常灵活,可以管理任何类型的第三方依赖。如果你想跳出纯CMake的领域,也可以看看像vcpkgconan这样的包管理器来处理依赖项,这些管理器提供了额外的功能和舒适性。


我回答了我的问题,因为我有一个可行的解决方案。感谢提供这些链接和示例! - dmedine

1

@ComicSansMS,没有看到WMF在列表中。我解决这个问题的方法如下。

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

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

我一直知道这样做是行得通的(Windows至少足够聪明,知道它自己的库在哪里,因此不需要发现路径),但我想知道是否有更符合CMake风格/风格上正确的方法来实现。


请注意,如果由于某种原因缺少这些库,则会出现链接器错误。 CMake不会检查这些.lib文件是否已经存在。使用find_library的优点在于:CMake将在配置期间发出警告,并且您有机会在进入构建工具链之前在那里修复它。 - ComicSansMS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接