2017-02-12 33 views
1

什么都对C进行必要的条件创建和使用适当的soname版本和相关的符号链接安装共享对象?的CMake不会产生。所以版本和soversion符号链接

我最近升级我的系统,什么使用的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

+0

你可以做的一件事是检查构建目录,如果那些创建那里。另外:你在做什么操作系统? – fedepad

+1

它的工作原理。谢谢。我正在使用gentoo。我确定我在构建目录,cmake等等中做了rm -rf,并且我尝试了SHARED,但显然我没有在同一时间完成这两个任务。我再试一次,它的工作原理。非常感谢您的宝贵时间! – augustin

回答

3

您正在添加“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

  • SONAME领域不再设置与创建MODULE库:命令:add_library命令。 MODULE
    库是为了在运行时显式动态加载。他们 不能链接,所以SONAME是没有用的。

之前,你可能已经设置SONAME并有VERSIONSOVERSION组也为MODULE库。
这是我能想到的唯一的事情就是防止你设置你的库VERSIONSOVERSION

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


重要提示:当你MODULE之间切换SHARED配置或反之亦然,这是一个很好的做法,删除 “旧” CMake的配置文件。
如果你的版本是源代码外的(我建议)并且该目录被称为build,那么在你的项目的根目录中,当你更改了CMakeLists.txt中的所需配置之后,你将执行如下操作:

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

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