CMake 列出 wxWidgets Dll 并在安装时复制它们
CMake list wxWidgets Dll and copy them on install
cmake 脚本 FindwxWidgets 创建所有 .lib 文件的列表。
但是这个脚本没有提供 wxWidgets dll 的列表。
将所有 wxWidgets Dll 文件存储在列表中用于调试和发布目标的 CMake 脚本是什么?
ps:我找到了一些基于 wxWidgets 和 CMake 的项目,但它们都是 link 静态地使用 wxWidgets。
正在进行的工作:
当前的肮脏解决方案是获取wxWidgets 目录中的所有dll,并将其安装在与exe 相同的文件夹中。但是,没有使用过的组件的过滤器,因为它没有使用 find_package 命令 linked。
# 复制 wxWidgets Dll
# 解压文件夹路径<br>
文件(GLOB wxwidgets_dlls "${wxWidgets_LIB_DIR}/*.dll")
列表(追加 WXWidgets_DLL_Slash “”)
foreach(WXWidgets_DLL ${wxwidgets_dlls})
# 检查 dll 是否不包含用于调试 dll 的 "ud"
get_filename_component(DLL_FILENAME ${WXWidgets_DLL} NAME_WE)
字符串(查找 ${DLL_FILENAME} "ud" debug_annot)
如果(${debug_annot} 少 0)
字符串(替换“\\”“/”WXWidgets_DLL${WXWidgets_DLL})
消息(状态 "Install ${WXWidgets_DLL}")
列表(追加 WXWidgets_DLL_Slash ${WXWidgets_DLL})
万一()
endforeach(WXWidgets_DLL)<br>
安装(文件
${WXWidgets_DLL_Slash}
目的地 。)
这是我与 CPack 一起使用的 what 示例。它将分析 .exe
和 dumpbin
/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
的完整路径。
cmake 脚本 FindwxWidgets 创建所有 .lib 文件的列表。
但是这个脚本没有提供 wxWidgets dll 的列表。
将所有 wxWidgets Dll 文件存储在列表中用于调试和发布目标的 CMake 脚本是什么?
ps:我找到了一些基于 wxWidgets 和 CMake 的项目,但它们都是 link 静态地使用 wxWidgets。
正在进行的工作:
当前的肮脏解决方案是获取wxWidgets 目录中的所有dll,并将其安装在与exe 相同的文件夹中。但是,没有使用过的组件的过滤器,因为它没有使用 find_package 命令 linked。
# 复制 wxWidgets Dll
# 解压文件夹路径<br>
文件(GLOB wxwidgets_dlls "${wxWidgets_LIB_DIR}/*.dll")
列表(追加 WXWidgets_DLL_Slash “”)
foreach(WXWidgets_DLL ${wxwidgets_dlls})
# 检查 dll 是否不包含用于调试 dll 的 "ud"
get_filename_component(DLL_FILENAME ${WXWidgets_DLL} NAME_WE)
字符串(查找 ${DLL_FILENAME} "ud" debug_annot)
如果(${debug_annot} 少 0)
字符串(替换“\\”“/”WXWidgets_DLL${WXWidgets_DLL})
消息(状态 "Install ${WXWidgets_DLL}")
列表(追加 WXWidgets_DLL_Slash ${WXWidgets_DLL})
万一()
endforeach(WXWidgets_DLL)<br>
安装(文件
${WXWidgets_DLL_Slash}
目的地 。)
这是我与 CPack 一起使用的 what 示例。它将分析 .exe
和 dumpbin
/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
的完整路径。