CMake GET#u RUNTIME#u DEPENDENCIES无法';当dll库通过lib(导入库)链接时,是否找不到它?

CMake GET#u RUNTIME#u DEPENDENCIES无法';当dll库通过lib(导入库)链接时,是否找不到它?,dll,cmake,dllimport,Dll,Cmake,Dllimport,构建操作系统:Windows 10,Cmake 3.16.3 我使用target\u link\u库将第三方.lib文件链接到我的.dll库 但是,当我使用GET\u RUNTIME\u DEPENDENCIES安装dll时,没有找到依赖项 它只在Windows上发生,在Linux上安装是可以的 有什么线索可以解决这个问题,或者至少可以调试它吗 在Windows上使用CMake确定依赖关系的确切命令是什么 我这样调用GET\u RUNTIME\u DEPENDENCIES: file(GET_R

构建操作系统:Windows 10,Cmake 3.16.3

我使用
target\u link\u库
将第三方
.lib
文件链接到我的
.dll

但是,当我使用
GET\u RUNTIME\u DEPENDENCIES
安装
dll
时,没有找到依赖项

它只在Windows上发生,在Linux上安装是可以的

有什么线索可以解决这个问题,或者至少可以调试它吗

在Windows上使用CMake确定依赖关系的确切命令是什么

我这样调用
GET\u RUNTIME\u DEPENDENCIES

file(GET_RUNTIME_DEPENDENCIES
    RESOLVED_DEPENDENCIES_VAR RES
    UNRESOLVED_DEPENDENCIES_VAR UNRES
    CONFLICTING_DEPENDENCIES_PREFIX CONFLICTING_DEPENDENCIES
    EXECUTABLES ${EXECS}
    LIBRARIES ${LIBS} ${MODULES} ${QTPLUGINS_LIBS}
    DIRECTORIES ${RUNTIME_DEPENDENCIES_DIRECTORIES}
    POST_EXCLUDE_REGEXES ${PLATFORM_POST_EXCLUDE_REGEXES}
)

其中
LIBS
包含我的
dll
,但没有
RES
no
unre
包含第三方
dll

获取运行时依赖项
不知道配置时间变量,因此需要手动指定它们。声明您可以将变量传递到安装步骤,但到目前为止,我还无法使其工作。幸运的是,它确实支持生成器表达式

代码段中的另一个问题是必须在安装时调用它。例如,在
安装(code…
块中

因此,考虑到所有这些,这应该让你开始

install(CODE [[
    file(GET_RUNTIME_DEPENDENCIES
        RESOLVED_DEPENDENCIES_VAR RES
        UNRESOLVED_DEPENDENCIES_VAR UNRES
        CONFLICTING_DEPENDENCIES_PREFIX CONFLICTING_DEPENDENCIES
        EXECUTABLES $<TARGET_FILE:your_executable_target_name>
        LIBRARIES $<TARGET_FILE:a_lib_target_name>
    )

    message("\n\nFound dependencies :")
    foreach(DEP ${RES})
        message("${DEP}")
    endforeach()
    message("\n\nNot found dependencies :")
    foreach(DEP ${UNRES})
        message("${DEP}")
    endforeach()
]])

请提供一些代码(最好是,)。根据当前信息,解决问题是一个很难猜测的游戏。
$
的参数只能是目标名称。(比如,如果您有一个目标定义
add_库(foo共享…
),那么
$
将插入
libfoo.so
在Linux上,
foo.dll
在Windows上等等。但是
$
$
不起作用。)关于变量传输,这可能很棘手,因为您必须确保变量没有转义,在传输代码中-您希望它得到扩展。我必须仔细检查我的答案中的语法,以确保我没有(再次)弄乱它,但它应该可以工作。因此,例如,在上面的代码中,您可以添加
install(代码“set(my_compiler\”${CMAKE\u CXX\u compiler\u ID}\”)
安装(代码…
块之前。然后您可以编写
消息(状态)“使用${my_compiler}构建”)
在第二个块中,要有安装过程输出--“使用GNU构建”,“使用Clang构建”,等等。@FeRD注意,我更新了答案以澄清您必须提供目标名称(而不是实际的文件名)。传递配置变量的问题是您不能在生成器表达式中使用它们,这使它们有些无用。例如,
$
错误和
表达式语法无法识别。
。即使您可以这样做,这也没有用,因为这些变量会在配置时立即计算。到他
install(code…
块点击该目录的
cmake_install.txt
(在初始
cmake
运行完成之前发生)这些生成器表达式都消失了,替换为它们的计算结果。如果需要将动态生成的搜索路径列表或
PRE\u EXCLUDE\u regex
传递到
文件(获取运行时依赖项)
,则在.Frex中传输正则变量非常方便。(我的意思是,实际上你可以正常地做
$
——你不能在一个
[[]]
-防护块内做,因为它阻止了所有变量的扩展。这很方便,在你写
代码
块时,不必转义每一个美元符号和大括号,但一切都是折衷的。)
cmake ..
cmake --build . --target install