CMake安装DLL至可执行输出目录报错:未指定DESTINATION
CMake install(FILES)报错“未指定DESTINATION”的原因及解决办法
问题重现
你尝试通过以下CMake代码将DLL文件安装到可执行文件输出目录:
#Place the dlls in the exe directory install(FILES ${MAIN_SRC_DIR}/ExternalDeps/OpenSSL/bin/libcrypto-3-x64.dll DESTINATION ${RUNTIME_OUTPUT_DIRECTORY})
但配置CMake时出现错误:
CMake Error at CMakeLists.txt:68 (install): install FILES given no DESTINATION!
原因分析
RUNTIME_OUTPUT_DIRECTORY的属性特性:它是目标专属属性,而非全局变量。直接在install命令中引用时,CMake在配置阶段无法确定其有效值(可能目标还未定义,或属性未被正确初始化),导致DESTINATION参数实际为空,触发报错。install命令的定位偏差:install是用于安装阶段(执行make install或cmake --install)的命令,作用是将文件部署到指定的安装前缀路径;而RUNTIME_OUTPUT_DIRECTORY是构建阶段的目标输出目录,两者设计场景不匹配。
解决办法
办法1:开发阶段自动复制DLL到构建目录
如果只是开发时需要让DLL和可执行文件在同一目录运行,更适合用add_custom_command替代install,它会在目标构建完成后自动复制文件:
# 替换MyExe为你的可执行目标名称 add_custom_command(TARGET MyExe POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${MAIN_SRC_DIR}/ExternalDeps/OpenSSL/bin/libcrypto-3-x64.dll $<TARGET_FILE_DIR:MyExe> )
$<TARGET_FILE_DIR:MyExe>是生成器表达式,能准确获取目标可执行文件的输出目录,避免属性未初始化的问题。
办法2:安装阶段部署到标准路径
如果是正式发布时的安装流程,使用CMake标准安装变量指定路径,确保DLL和可执行文件安装到同一目录:
install(FILES ${MAIN_SRC_DIR}/ExternalDeps/OpenSSL/bin/libcrypto-3-x64.dll DESTINATION ${CMAKE_INSTALL_BINDIR})
执行cmake --install时,DLL会被安装到CMAKE_INSTALL_PREFIX/bin(Windows下),与可执行文件的默认安装位置一致。
办法3:获取目标属性用于install(不推荐常规场景)
一定要用install命令指向构建目录的话,先通过get_target_property获取目标的运行时输出目录:
# 替换MyExe为你的可执行目标名称 get_target_property(EXE_RUNTIME_DIR MyExe RUNTIME_OUTPUT_DIRECTORY) install(FILES ${MAIN_SRC_DIR}/ExternalDeps/OpenSSL/bin/libcrypto-3-x64.dll DESTINATION ${EXE_RUNTIME_DIR})
注意:这种方式会把文件安装到构建目录,不符合install命令的设计初衷,仅适合特殊场景。
内容的提问来源于stack exchange,提问作者Zebrafish
相关产品推荐
相关产品推荐

