Cmake不会创建.so版本和soversion符号链接

时间:2017-02-12 03:26:03

标签: cmake

cmake使用适当的soname版本和相关符号链接创建和安装共享对象的所有必要条件是什么?

我最近升级了我的系统,以及与cmake 2.8一起使用的系统,不再适用于cmake 3.7。我已经检查了最新文档,但就我的问题而言,我无法理解它。

除了符号链接之外,我曾经安装了.so文件,包含完整版的真实.so文件。

 pluginname.so.1 => pluginname.so.1.1.0
 pluginname.so.1.1.0

现在,cmake只构建并安装 pluginname.so ,没有任何版本后缀和符号链接。

我不会在任何地方使用NO_SONAME:
https://cmake.org/cmake/help/v3.7/prop_tgt/NO_SONAME.html#prop_tgt:NO_SONAME

add_library(${PLUGIN_NAME} MODULE ${SRC})

# I call message(...) to check that the values are indeed set:
message("plugin ${PLUGIN_NAME}") 
message("version ${CORE_MAJOR_VERSION}.${PLUGIN_MAJOR_VERSION}.${PLUGIN_BUGFIX_VERSION}") 
message("soversion: ${CORE_MAJOR_VERSION}")
message("prefix ${PLUGIN_PREFIX}") 

if (NOT NO_SONAME)
   message("Ok, no_soname is not set!")
endif()

set_target_properties(${PLUGIN_NAME} PROPERTIES
    VERSION ${CORE_MAJOR_VERSION}.${PLUGIN_MAJOR_VERSION}.${PLUGIN_BUGFIX_VERSION}
    SOVERSION ${CORE_MAJOR_VERSION} 
    PREFIX ${PLUGIN_PREFIX}
)
 install(TARGETS ${PLUGIN_NAME} DESTINATION ${PLUGIN_INSTALL_DIR})

还有哪些其他调试策略可以使用?

我尝试更改 add_library($ {PLUGIN_NAME} MODULE $ {SRC})行,用 SHARED 替换 MODULE ,但它没有似乎有所作为。

1 个答案:

答案 0 :(得分:4)

您正在添加" MODULE"图书馆而不是"共享"一。

我认为这可能与以下内容有关:
https://gitlab.kitware.com/cmake/cmake/commit/f799ffb5cb895855ac2aba54765622b81db5be38

再次强调: https://gitlab.kitware.com/cmake/cmake/raw/f799ffb5cb895855ac2aba54765622b81db5be38/Help/release/dev/modules-no-soname.rst

  
      
  • 不再为使用:command:SONAME命令创建的MODULE库设置add_library字段。 MODULE
      库用于在运行时显式动态加载。他们   无法关联,因此SONAME无用。
  •   

您可以设置SONAME并为VERSION库设置SOVERSIONMODULE
这是我唯一能想到的就是阻止你为你的库设置VERSIONSOVERSION

更多参考文献:
https://gitlab.cern.ch/dss/eos/commit/18ff0746ff4bc1263648fe3fdda79075ce262093
https://gitlab.cern.ch/dss/eos/commit/a7a6d486168e4de9a25eddd84cb19af0bab1ab5f

重要提示:当您在MODULESHARED配置之间切换时,反之亦然,这是一个很好的做法,即删除旧的" CMake配置文件 如果您的构建不在源代码(我建议)并且目录名为build,那么从项目的根目录开始,在您更改CMakeLists.txt中的所需配置后,您将做类似的事情:

rm -rf build && mkdir build && cd build && cmake ..  

这将确保您在构建项目之前从干净的配置状态开始。