这个问题询问如何使用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}")
这样做的规范方法是什么?
答案 0 :(得分:0)
当一个库由CMake构建时, CMake 谁为其分配了soversion数(根据project's settings)。
当库不是由CMake构建的时, CMake不知道soversion ,因此无法为您创建符号链接。
如果您对CMake实际安装符号链接而不是文件感到困扰,请在安装前解析符号链接,如that question中所示。
好吧,你可以要求CMake 猜测库的搜索(例如通过解析符号链接并检查它们的名字)。但为什么你需要符号链接?
soversion符号链接的主要目的是解决与未来库更新的兼容性问题。但只有在项目创建库的情况下安装库时才可以进行更新。
如果您的项目安装了由其他项目生成的库,则您不太可能希望支持本地库安装的更新。所以你不需要支持soversions。