【问题标题】:CMake list wxWidgets Dll and copy them on installCMake 列出 wxWidgets Dll 并在安装时复制它们
【发布时间】:2017-06-12 00:51:48
【问题描述】:

cmake 脚本 FindwxWidgets 创建所有 .lib 文件的列表。

但是,此脚本不提供 wxWidgets dll 列表。

将所有 wxWidgets Dll 文件存储在列表中以用于调试和发布目标的 CMake 脚本是什么?

ps:我发现了一些基于 wxWidgets 和 CMake 的项目,但它们都与 wxWidgets 静态链接。

正在进行的工作:

当前肮脏的解决方案是获取 wxWidgets 目录中的所有 dll 并安装在与 exe 相同的文件夹中。但是没有过滤使用过的组件,因为它没有与 find_package 命令链接。

# Copy wxWidgets Dll's # extract folder path
file(GLOB wxwidgets_dlls "${wxWidgets_LIB_DIR}/*.dll") list(APPEND WXWidgets_DLL_Slash "") foreach(WXWidgets_DLL ${wxwidgets_dlls}) # Check if dll does not contain "ud" for debug dll get_filename_component(DLL_FILENAME ${WXWidgets_DLL} NAME_WE) string(FIND ${DLL_FILENAME} "ud" debug_annot) if(${debug_annot} LESS 0) string(REPLACE "\\" "/" WXWidgets_DLL ${WXWidgets_DLL}) MESSAGE(STATUS "Install ${WXWidgets_DLL}") list(APPEND WXWidgets_DLL_Slash ${WXWidgets_DLL}) endif() endforeach(WXWidgets_DLL)
install(FILES ${WXWidgets_DLL_Slash} DESTINATION .)

【问题讨论】:

  • 不确定你的项目是否必须使用 CMake,但如果没有,为什么不编译 wxWidgets 而不使用 CMake?这很容易......
  • @macroland 我不编译 wxWidgets,我编译了一个链接到 wxWidgets 的项目。然而,动态链接最终的可执行文件需要 wxWidgets Dlls。所以我必须找到一种方法来使用 CMake 查找和复制这些 Dll。
  • 我会投票结束你的问题,因为不清楚你真正想要什么。可以举一个最小的例子来说明你目前拥有什么以及你想要什么缺乏什么?

标签: cmake wxwidgets


【解决方案1】:

这是我与 CPack 一起使用的what 示例。它将分析.exedumpbin/readelf 以查找要复制的库。

我的脚本还尝试剥离生成的 DLL(如果需要,您可以删除该部分)。在您的install(TARGETS ...) 命令之后插入此

您可能需要调整的内容(小心,它们会在安装时间之前展开):

  • RUNTIME_DIR - 像 bin 这样的子目录,其中安装了您的 .exe.dll 文件
  • EXECUTABLE_NAME - 没有.exe 的目标名称
  • fixup_bundle 的第三个参数 - 它的 \"\" 但您可能需要将其更改为 \"${wxWidgets_LIB_DIR}\"(从中复制 dll 的目录)
install(CODE "
    include(BundleUtilities)
    fixup_bundle(\"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${RUNTIME_DIR}/${EXECUTABLE_NAME}${CMAKE_EXECUTABLE_SUFFIX}\" \"\" \"\")
    file(GLOB dynamic_libs \"\${CMAKE_INSTALL_PREFIX}/${RUNTIME_DIR}/*${CMAKE_SHARED_LIBRARY_SUFFIX}*\")
    message(STATUS \"GLOB: \${dynamic_libs}\")
    foreach(dll IN LISTS dynamic_libs)
        if(\"${CMAKE_STRIP}\")
            execute_process(COMMAND ${CMAKE_STRIP} \"-s\" \${dll})
        endif()
    endforeach(dll)
")

更新:install(CODE ...) 将字符串内的命令逐字添加到cmake_install.cmake 文件中,因此生成器表达式不会被扩展。 有用变量的数量也非常有限,例如我的示例中的${CMAKE_INSTALL_PREFIX}cmake_install.cmake 内部展开,但在去那里之前应该先展开${CMAKE_SHARED_LIBRARY_SUFFIX}

您可以尝试使用${PROJECT_BINARY_DIR}/\${CMAKE_INSTALL_PREFIX} 手动创建.exe 的完整路径。

【讨论】:

  • 谢谢。我明天会尝试并提供反馈。
  • 我尝试使用 $ ,它应该被评估为最终的 exe 名称,但这个变量不会扩展。
  • @nicolas-f 抱歉,生成器表达式在这种情况下不起作用。 install (CODE ..) 只是将字符串中的命令添加到 cmake_install.cmake 文件中。在那个文件生成器表达式没有展开并且很多变量丢失(我们有 CMAKE_INSTALL_PREFIX 可用,但 CMAKE_SHARED_LIBRARY_SUFFIX 必须事先手动展开)
  • 它似乎有效,谢谢。但是我仍然有错误消息ci.appveyor.com/project/nicolas-f/i-simpa/build/1.0.17#L4922
  • @nicolas-f warning :cannot resolve item 'MSVCR71.dll' 没问题,因为这个库是 MSVC 可再发行组件的一部分。如果您的意思是其他错误,请提出一个新问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-08
  • 1970-01-01
  • 2016-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多