CMake报错:install Library TARGETS未指定DESTINATION求解决方案
解决CMake报错:
install Library TARGETS given no DESTINATION! 问题本质
你遇到的报错核心是Tacopie库的CMake脚本中,install(TARGETS)指令的LIBRARY选项未指定DESTINATION——虽然RESOURCE类型明确了安装路径,但CMake要求每个目标类型(LIBRARY/ARCHIVE/RUNTIME等)必须单独指定安装位置,或使用全局统一的DESTINATION配置,二者缺一不可。
可行解决方案(无需fork或回退代码)
鉴于你无法修改第三方库的原脚本,也不想放弃主分支的修复内容,以下几种方法可在不改动原仓库的前提下解决问题:
方法1:构建时动态修改Tacopie的CMakeLists.txt
在你项目的CMakeLists.txt中,引入Tacopie库之前添加以下代码,自动补全LIBRARY的安装路径:
# 修复tacopie的install指令缺失DESTINATION的问题 file(READ "${CMAKE_CURRENT_SOURCE_DIR}/tacopie/CMakeLists.txt" TACOPIE_CMAKE_CONTENT) # 给LIBRARY选项添加DESTINATION,复用默认的系统库安装目录 string(REPLACE "LIBRARY " "LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} " TACOPIE_CMAKE_CONTENT "${TACOPIE_CMAKE_CONTENT}") file(WRITE "${CMAKE_CURRENT_SOURCE_DIR}/tacopie/CMakeLists.txt" TACOPIE_CMAKE_CONTENT)
之后正常执行add_subdirectory(tacopie)即可。如果你的项目用Git管理,可将tacopie/CMakeLists.txt临时加入.gitignore忽略修改,或在构建脚本末尾恢复原文件。
方法2:使用Git Patch自动修复
- 在项目根目录创建补丁文件
tacopie_install_fix.patch,内容如下(根据实际报错的行号调整@@后的数字):
diff --git a/tacopie/CMakeLists.txt b/tacopie/CMakeLists.txt index 1234abc..5678def 100644 --- a/tacopie/CMakeLists.txt +++ b/tacopie/CMakeLists.txt @@ -144,7 +144,7 @@ install(TARGETS ${PROJECT_NAME} EXPORT ${EXPORT_TARGET_NAME} LIBRARY RESOURCE DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
将第二行的LIBRARY 改为LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 。
- 在你项目的CMakeLists.txt中,引入Tacopie前执行补丁:
# 应用补丁修复tacopie的CMake配置 execute_process(COMMAND git apply "${CMAKE_CURRENT_SOURCE_DIR}/tacopie_install_fix.patch" WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" RESULT_VARIABLE PATCH_RESULT) if(NOT PATCH_RESULT EQUAL 0) message(WARNING "Failed to apply tacopie install fix patch") endif()
方法3:配合FetchContent拉取时修改(适合远程依赖)
如果你的项目用FetchContent自动拉取Tacopie,可在拉取完成后修改源码副本,完全不影响本地Git仓库:
FetchContent_Declare( tacopie GIT_REPOSITORY https://github.com/cpp-redis/tacopie.git GIT_TAG main # 替换为你需要的分支/标签 ) FetchContent_GetProperties(tacopie) if(NOT tacopie_POPULATED) FetchContent_Populate(tacopie) # 修改拉取后的CMakeLists.txt file(READ "${tacopie_SOURCE_DIR}/CMakeLists.txt" TACOPIE_CMAKE_CONTENT) string(REPLACE "LIBRARY " "LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} " TACOPIE_CMAKE_CONTENT "${TACOPIE_CMAKE_CONTENT}") file(WRITE "${tacopie_SOURCE_DIR}/CMakeLists.txt" TACOPIE_CMAKE_CONTENT) endif() add_subdirectory(${tacopie_SOURCE_DIR} ${tacopie_BINARY_DIR})
内容的提问来源于stack exchange,提问作者J. Gwinner
相关产品推荐
相关产品推荐

