【问题标题】:how can I tell cmake to find Windows Media Foundation?我如何告诉 cmake 找到 Windows Media Foundation?
【发布时间】:2017-12-04 13:12:07
【问题描述】:

要让 cmake 链接到(例如)boost::thread,我可以写:

find_package(Boost REQUIRED COMPONENTS thread)

然后:

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

如何使用 Windows Media Foundation 库执行此操作?

【问题讨论】:

    标签: c++ windows cmake ms-media-foundation


    【解决方案1】:

    使用 CMake 处理依赖关系的三种基本方法:

    CMake 附带 bunch of find modules for finding external libraries。您对find_package(Boost ...) 的调用由FindBoost 模块处理。

    或者,您的依赖项可能附带config script,可以通过find_package 找到。这是用于查找例如的方法。 Qt5.

    不幸的是,在您的情况下,这些都不适用,这给我们留下了最后一个选择:编写您自己的查找脚本!您可以查看the source code for some of the modules that ship with CMake 作为示例。 Boost 相当复杂,但 FindVulkan 例如相当简单。

    您主要需要为包含路径调用find_path,为.lib 文件调用find_libraryMSDN page for the Windows Media Foundation 告诉您要搜索的内容。如果幸运的话,SDK 安装程序会设置一个环境变量,您可以将其用作find_* 调用的提示,在这种情况下,您的脚本将是全自动的。如果没有,则必须在运行 CMake 时手动指定位置。

    虽然这种方法可能看起来很麻烦,但它非常灵活,并且允许管理任何类型的第三方依赖项。如果您想跳出纯 CMake 的领域,您还可以查看像 vcpkgconan 这样的包管理器来处理依赖项,它们提供了额外的功能和舒适性。

    【讨论】:

    • 我回答了我的问题,因为我有一个可行的解决方案。 +1 以获得出色的链接和示例!
    【解决方案2】:

    @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-y /风格上“正确”的做法。

    【讨论】:

    • 请注意,如果这些库由于某种原因丢失,您最终会遇到链接器错误。 CMake 不会检查那些.lib 文件是否已经存在。这就是在这里使用find_library 的优势:CMake 会在配置过程中抱怨,您有机会在它进入构建工具链之前修复它。
    猜你喜欢
    • 1970-01-01
    • 2018-11-13
    • 2016-11-05
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多