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
相关产品推荐
相关产品推荐

