CMake GET#u RUNTIME#u DEPENDENCIES无法';当dll库通过lib(导入库)链接时,是否找不到它?
构建操作系统:Windows 10,Cmake 3.16.3 我使用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
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
nounre
包含第三方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