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 .)
答案 0 :(得分:1)
以下是我与CPack一起使用的what示例。它将使用.exe
/ dumpbin
分析readelf
以查找要复制的库。
我的脚本也会尝试去除生成的DLL(如果需要,可以删除该部分)。在<{1}}命令之后插入 。
您可能需要调整的事项(小心,它们将在安装时间之前扩展):
install(TARGETS ...)
- RUNTIME_DIR
的子目录,其中安装了bin
和.exe
个文件.dll
- 没有EXECUTABLE_NAME
.exe
的第三个参数 - 其fixup_bundle
,但您可能需要将其更改为\"\"
(复制dll的目录)\"${wxWidgets_LIB_DIR}\"
更新: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}
的完整路径。