CMake list wxWidgets Dll并在安装时复制它们



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

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

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

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

正在进行的工作:

当前的脏解决方案是获取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 .)

下面是我与CPack一起使用的示例。它将对.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的完整路径。

最新更新