Cmake 无法创建 .so 版本和 soversion 符号链接。

4
什么是让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})行,将MODULE替换为SHARED,但似乎没有任何差异。


1
在我回答完之后,我重新阅读了你的问题并发现你说你尝试过使用SHARED...当你尝试时,我相信你删除了构建目录并为cmake启动了全新的配置:rm -rf build && mkdir build && cd build && cmake .., 是吗? - fedepad
你可以做的一件事情是检查编译目录,看看是否在那里创建了这些文件。另外:你在使用什么操作系统? - fedepad
1
它可以工作。谢谢。我正在使用gentoo。我确定我在构建目录中执行了rm -rf,cmake ..等操作,并且我确实尝试了SHARED,但显然我没有同时执行两个操作。我再次尝试,现在它可以工作了。非常感谢您的时间! - augustin
1
谢谢,我很高兴它起作用了!也许我会在某个时候添加“清理”部分到答案中作为注释或其他什么…… - fedepad
1个回答

6
您正在添加一个“MODULE”库,而不是“SHARED”库。
我认为这可能与以下内容有关: https://gitlab.kitware.com/cmake/cmake/commit/f799ffb5cb895855ac2aba54765622b81db5be38 并且在这里再次强调: https://gitlab.kitware.com/cmake/cmake/raw/f799ffb5cb895855ac2aba54765622b81db5be38/Help/release/dev/modules-no-soname.rst
  • add_library 命令创建的 MODULE 库不再设置 SONAME 字段。
    MODULE 库用于在运行时进行显式动态加载,它们不能被链接,因此 SONAME 不起作用。

以前您可以为 MODULE 库设置 SONAME,同时还可以设置 VERSIONSOVERSION。唯一我能想到的是阻止您为库设置 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 ..  

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接