You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake install DESTINATION在Linux系统中失效问题求助

解决Linux下CMake共享库安装路径不符合预期的问题

这个问题其实是因为你没考虑到CMake对不同平台的库类型分类:

  • 在Windows上,SHARED库对应的是RUNTIME目标(.dll文件),静态库对应ARCHIVE(.lib);
  • 但在Linux上,SHARED库对应的是LIBRARY目标(.so文件),而你当前的install命令只指定了ARCHIVE和RUNTIME的安装路径,完全没处理LIBRARY类型,所以CMake就用了默认的CMAKE_INSTALL_PREFIX/lib路径(默认CMAKE_INSTALL_PREFIX是/usr/local),这就是为什么会装到/usr/local/lib去。

直接解决方法:补充LIBRARY目标的安装路径

修改你的CMakeLists.txt,在install命令里加上LIBRARY的目标配置,这样Linux下的.so文件就会安装到你指定的目录了:

add_library(test SHARED)
target_sources(test PRIVATE test.cpp)
install(TARGETS test 
        ARCHIVE DESTINATION /home/user/cmake_test/out/lib
        RUNTIME DESTINATION /home/user/cmake_test/out/bin
        LIBRARY DESTINATION /home/user/cmake_test/out/lib)

更优雅的跨平台写法:用CMAKE_INSTALL_PREFIX配合相对路径

你提到的CMAKE_INSTALL_PREFIX其实是完全可用的,而且这种方式更适合跨平台,不会把绝对路径写死在配置文件里。

首先,在执行cmake的时候指定前缀路径:

cmake -DCMAKE_INSTALL_PREFIX=/home/user/cmake_test/out ..

然后修改CMakeLists.txt为相对路径的写法:

add_library(test SHARED)
target_sources(test PRIVATE test.cpp)
install(TARGETS test 
        ARCHIVE DESTINATION lib
        RUNTIME DESTINATION bin
        LIBRARY DESTINATION lib)

这样不管是Windows还是Linux,都会把对应类型的文件安装到CMAKE_INSTALL_PREFIX下的lib或bin目录里,维护起来更方便。

额外说明

CMake的install(TARGETS)命令针对不同目标类型的对应关系:

  • ARCHIVE:静态库文件(Windows的.lib、Linux的.a)
  • RUNTIME:可执行文件和Windows的DLL文件
  • LIBRARY:Linux/macOS的共享库文件(.so、.dylib)

只要确保每个你需要的目标类型都指定了DESTINATION,就不会出现路径不符合预期的问题了。

内容的提问来源于stack exchange,提问作者Alan Birtles

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:36:36