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

aug*_*tin 3 cmake

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

我最近升级了我的系统,以前与cmake 2.8兼容的系统不再与cmake 3.7兼容。我检查了最新的文档,但对于我的问题,我却听不懂。

我以前安装过.so文件,除了符号链接之外,还安装了具有完整版本的真实.so文件。

 pluginname.so.1 => pluginname.so.1.1.0
 pluginname.so.1.1.0
Run Code Online (Sandbox Code Playgroud)

现在,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})
Run Code Online (Sandbox Code Playgroud)

还有哪些其他调试策略可以在这里工作?

我曾试图改变add_library($ {} PLUGIN_NAME MODULE $ {} SRC)线更换模块共享关系,但它似乎不有所作为。

fed*_*pad 5

您正在添加一个“模块”库,而不是一个“共享”库。

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

并且这里再次受到压力:https : //gitlab.kitware.com/cmake/cmake/raw/f799ffb5cb895855ac2aba54765622b81db5be38/Help/release/dev/modules-no-soname.rst

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

之前,你可以拥有一套SONAME,并有VERSIONSOVERSION还为MODULE图书馆。
我唯一能想到的就是阻止您为库设置VERSIONSOVERSION

更多参考资料:
https : //gitlab.cern.ch/dss/eos/commit/18ff0746ff4bc1263648fe3fdda79075ce262093
https://gitlab.cern.ch/dss/eos/commit/a7a6d486168e4de9a25eddd84cb19af0bab1ab5f5


重要说明:当您切换MODULESHARED配置或反之时,删除“旧的” CMake配置文件是一个好习惯。
如果您的构建是源代码外的(我建议),并且该目录称为build,那么从项目的根目录中,在中更改所需的配置后CMakeLists.txt,您将执行以下操作:

rm -rf build && mkdir build && cd build && cmake ..  
Run Code Online (Sandbox Code Playgroud)

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