Visual Studio Code中CMake install失效,静态库未安装到指定路径
静态库未安装到CMake指定路径的问题排查与解决
我在Linux系统(cmake 3.17.3)下尝试用CMake和VS Code生成并安装静态库,但生成的libpoly.a没有安装到预期路径,反而出现在/Main_Folder/Poly目录下。
目录结构
Main_Folder - Poly - - CMakeLists.txt - - src - - - Poly.cpp - - - Poly.h - Test - - TestLibs - - - TestLibs.cpp - - - TestLibs.h
我的CMakeLists.txt内容
cmake_minimum_required(VERSION 3.0.0) project(poly) set(CMAKE_BUILD_TYPE Debug) #Bring the headers, such as Student.h into the project include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src) file(GLOB SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/*") #Generate the static library from the sources add_library(poly STATIC ${SOURCES}) #Set the location for library installation install( TARGETS poly LIBRARY DESTINATION /Main_Folder/Test/TestLibs/Poly ARCHIVE DESTINATION /Main_Folder/Test/TestLibs/Poly RUNTIME DESTINATION /Main_Folder/Test/TestLibs/Poly )
cmake_install.cmake内容
# Install script for directory: Main_Folder/Poly # Set the install prefix if(NOT DEFINED CMAKE_INSTALL_PREFIX) set(CMAKE_INSTALL_PREFIX "/usr/local") endif() string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") # Set the install configuration name. if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) if(BUILD_TYPE) string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") else() set(CMAKE_INSTALL_CONFIG_NAME "Debug") endif() message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") endif() # Set the component getting installed. if(NOT CMAKE_INSTALL_COMPONENT) if(COMPONENT) message(STATUS "Install component: \"${COMPONENT}\"") set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") else() set(CMAKE_INSTALL_COMPONENT) endif() endif() # Install shared libraries without execute permission? if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) set(CMAKE_INSTALL_SO_NO_EXE "0") endif() # Is this installation the result of a crosscompile? if(NOT DEFINED CMAKE_CROSSCOMPILING) set(CMAKE_CROSSCOMPILING "FALSE") endif() if("x${CMAKE_INSTALL_COMPONENT}x" STREQUAL "xUnspecifiedx" OR NOT CMAKE_INSTALL_COMPONENT) list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES "/Main_Folder/Test/TestLibs/Poly/libpoly.a") if(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") endif() if(CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") endif() file(INSTALL DESTINATION "/Main_Folder/Test/TestLibs/Poly/" TYPE STATIC_LIBRARY FILES "/home/myUser/git/Main_Folder/Test/TestLibs/Poly/libpoly.a") endif()
问题分析与解决方法
核心问题点
- 绝对路径引发安装异常:在
install指令中使用了绝对路径(/Main_Folder/...),CMake会对这类路径发出警告,Linux环境下还可能因权限、路径解析逻辑问题导致安装失败,cmake_install.cmake中的警告信息也能佐证这一点。 - 构建与安装路径混淆:
libpoly.a出现在/Main_Folder/Poly是因为这是CMake构建阶段的默认输出目录(如果直接在源码目录执行构建),并非安装后的目标路径,大概率是没执行安装步骤。
解决步骤
- 改用相对路径配置安装目标:替换绝对路径为基于当前CMakeLists目录的相对路径,修改
install指令如下:install( TARGETS poly # 静态库仅需配置ARCHIVE即可 ARCHIVE DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/../Test/TestLibs/Poly )CMAKE_CURRENT_SOURCE_DIR指向/Main_Folder/Poly,通过../跳转到上级目录后指向目标安装路径,符合CMake路径规范。 - 执行完整安装流程:完成构建后,在终端执行
make install(若使用Makefile生成器),或在VS Code的CMake插件中选择"Install"目标执行,确保安装环节被触发。 - 使用独立构建目录:建议在
/Main_Folder/Poly下创建build子目录,进入build后执行cmake ..再进行构建安装,避免构建产物与源码混杂导致路径混淆。
内容的提问来源于stack exchange,提问作者hcastro
相关产品推荐
相关产品推荐

