【问题标题】:Copy all dlls that an executable links to to the executable directory将可执行文件链接到的所有 dll 复制到可执行文件目录
【发布时间】:2012-12-30 08:14:01
【问题描述】:

This question 询问类似的问题,但只需要手动指定要复制的 dll。我的问题是:有没有办法让 CMake 复制链接到可执行库的所有 dll,而无需手动告诉 CMake 要复制哪些文件?有时 CMake 更了解是否需要 dll。例如,在安装了同一个库(例如 Boost)的 dll 和静态库的系统中,我们选择静态链接到 Boost,那么我们不需要复制 dll。因此,与手动指定要复制的文件相比,CMake 可以做出更好的决定。另一个例子是,我的 QT 库链接到 ICU 库,在编写 CMakeLists.txt 时,我对此一无所知,所以我不可能告诉 CMake 复制 ICU dll,所以这应该由 CMake 而不是人类。

假设操作系统是 Windows。

【问题讨论】:

  • 我看到了一个大问题:您无法在编译时知道所有必要的 dll。延迟加载的 dll 或插件(具有自己的依赖 dll)在运行时“找到”...

标签: dll cmake


【解决方案1】:

查看 CMake 的 BundleUtilities.cmake,它提供了 fixup_bundle(...)

详情可以在这里找到:

http://www.cmake.org/Wiki/BundleUtilitiesExample

http://www.cmake.org/cmake/help/v2.8.8/cmake.html#module:BundleUtilities

【讨论】:

  • 仅适用于 MacOSX。看起来不适用于 Windows,或者我错过了一些东西。我查看了 BundleUtilties 的源代码,它检查了 .app 目录的存在。
  • 我不得不承认我还没有使用它,因为我们有一个自定义实现在运行之前,它在 CMake 中可用于非 Mac 平台。我猜代码显示了一些“历史”变量/函数名称。该代码包含 Windows 和 Linux 的案例处理。例如:fixup_bundle 调用看起来像 Mac OS 的 get_dotapp_dir,但在其中,有一个 IF 通过检查 .app 目录在 Mac 和非 Mac 处理之间分隔
  • BundleUtilities 应该也适用于 windows,尽管我使用 windows 我没有测试过这个。我更喜欢在 cmake 中使用我自己的脚本来生成它需要复制的 dll 列表,并从该列表中生成一个复制所需 dll 的批处理文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-13
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
相关资源
最近更新 更多