CMake如何在find_package()[duplicate]后复制dll

rks48beu  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(84)

此问题已在此处有答案

How to copy DLL files into the same folder as the executable using CMake?(12个回答)
2个月前关闭。
第一次在Visual Studio 2022中尝试CMAKE项目,我试图调整CmakeLists.txtfrom this repository以使用Open3D library
据我所知,下面的部分意味着在Windows上,如果Open3D是作为共享库构建的,那么.dll文件应该被复制到项目的输出文件夹中。

if(WIN32)
    get_target_property(open3d_type Open3D::Open3D TYPE)
    if(open3d_type STREQUAL "SHARED_LIBRARY")
        message(STATUS "Copying Open3D.dll to ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>")
        add_custom_command(TARGET Draw POST_BUILD
                           COMMAND ${CMAKE_COMMAND} -E copy
                                   ${CMAKE_INSTALL_PREFIX}/bin/Open3D.dll
                                   ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>)
    endif()
endif()

然而,在我的机器上,变量${CMAKE_INSTALL_PREFIX}指向<project-root>/out/install/x64-debug,这似乎是从VS2022(?).

我所做的

到目前为止,我已经将系统变量添加到我的Windows环境变量中,称为OPEN3D_DIR,它指向open3d二进制文件的根(=包含bin,CMake,包含库的lib文件夹的文件夹)与find_package(OPEN3D REQUIRED)似乎可以工作,但是在脚本中,变量${OPEN3D_DIR}指向<OPEN3D-root>/CMake
基本上,简而言之,我的问题是如何找到包路径通常是处理,从哪里来的${CMAKE_INSTALL_PREFIX}的值,一般来说,如何设置变量,这通常是在CMAKE GUI设置?

8dtrkrch

8dtrkrch1#

您可以使用$<TARGET_FILE:Open3D::Open3D>从目标获取DLL的路径,也可以将输出目录简化为$<TARGET_FILE_DIR:Draw>
copy_if_different可能比copy更好,可以让你的构建更快一些。
例如:

if(WIN32)
    get_target_property(open3d_type Open3D::Open3D TYPE)
    if(open3d_type STREQUAL "SHARED_LIBRARY")
        message(STATUS "Copying Open3D.dll to $<TARGET_FILE_DIR:Draw>")
        add_custom_command(TARGET Draw POST_BUILD
                           COMMAND ${CMAKE_COMMAND} -E copy_if_different
                                   $<TARGET_FILE:Open3D::Open3D>
                                   $<TARGET_FILE_DIR:Draw>)
    endif()
endif()

更多有用的表达式请参见https://cmake.org/cmake/help/latest/manual/cmake-generator-expressions.7.html

相关问题