使用必要的链接安装共享导入的库

时间:2017-07-20 11:17:12

标签: cmake

这个问题询问如何使用cmake安装共享库,该库已导入而不是由当前项目构建:

Can I install shared imported library?

重复此问题:

add_library(libfoobar SHARED IMPORTED)
# this install command is illegal
install(TARGET libfoobar LIBRARY DESTINATION "${RPMBUILDROOT}${LIBDIR}")

这是作为[https://gitlab.kitware.com/cmake/cmake/issues/14311|issue]提出的,cmake已经关闭,实际上解决方案无法解决。理由是,cmake对进口目标的了解程度不够,无法可靠地安装它。

这个问题的答案有一点错过了,安装(TARGET)将自动创建从libfoo.so到libfoo.so.major和libfoo.so.minor的链接,这些链接在GNU / Linux和其他类似unix的平台上是必需的。

有没有办法劫持cmake来处理自定义目标,好像它是由项目构建的,或者说服它来创建这些链接? 类似的东西:

add_library(libfoobar SHARED IMPORTED)

#? add_custom_target(X libfoobar) 
install(TARGET X LIBRARY DESTINATION "${RPMBUILDROOT}${LIBDIR}")

这样做的规范方法是什么?

1 个答案:

答案 0 :(得分:0)

当一个库由CMake构建时, CMake 为其分配了soversion数(根据project's settings)。

当库不是由CMake构建的时, CMake不知道soversion ,因此无法为您创建符号链接。

如果您对CMake实际安装符号链接而不是文件感到困扰,请在安装前解析符号链接,如that question中所示。

好吧,你可以要求CMake 猜测库的搜索(例如通过解析符号链接并检查它们的名字)。但为什么你需要符号链接?

soversion符号链接的主要目的是解决与未来库更新的兼容性问题。但只有在项目创建库的情况下安装库时才可以进行更新。

如果您的项目安装了由其他项目生成的库,则您不太可能希望支持本地库安装的更新。所以你不需要支持soversions。

相关问题