【问题标题】:How to force CMake not add major/minor version in shared library filename and soname?如何强制 CMake 不在共享库文件名和 soname 中添加主要/次要版本?
【发布时间】:2018-11-30 07:19:20
【问题描述】:

我正在使用 Cmake for Android(使用 Android NDK)编译 libclang

这是配置文件名和soname的CMake配置部分:

set_target_properties(libclang
    PROPERTIES
    VERSION ${LIBCLANG_LIBRARY_VERSION}
    DEFINE_SYMBOL _CINDEX_LIB_)

在不同的文件中:

set(LIBCLANG_LIBRARY_VERSION
    "${CLANG_VERSION_MAJOR}" CACHE STRING
    "Major version number that will be appended to the libclang library")

if(NOT DEFINED CLANG_VERSION_MAJOR)
  set(CLANG_VERSION_MAJOR ${LLVM_VERSION_MAJOR})
endif()

由于我编译了版本“7.0.0”的 llvm/clang,libclang 文件名和 soname 是 libclang.so.7,这对于 Android 来说是不需要的。

~/llvm/build anton$ls -l lib/libclang.so
lrwxrwxrwx 1 anton anton 13 Nov 30 12:13 lib/libclang.so -> libclang.so.7
~/llvm/build anton$arm-linux-androideabi-readelf --dynamic lib/libclang.so.7 | grep SONAME
 0x0000000e (SONAME)                     Library soname: [libclang.so.7]

如何避免在文件名和 soname 中添加“.7”(使其只是 libclang.so)?

我已经尝试过:

1) 如下注释属性:

set_target_properties(libclang
  PROPERTIES
  #VERSION ${LIBCLANG_LIBRARY_VERSION}
  DEFINE_SYMBOL _CINDEX_LIB_)

由于某种原因,文件名和 soname 仍然是“.so.7”

2) 设置为空:

set_target_properties(libclang
  PROPERTIES
  VERSION ""
  DEFINE_SYMBOL _CINDEX_LIB_)

文件名和soname是“.so”。 (末尾有点)。

我能做什么?

【问题讨论】:

  • .so 之后的数字被称为 so-version,负责它的 CMake 属性是 SOVERSION。请注意,如果缺少此属性,但存在 VERSION 一个,则假定 SOVERSIONVERSION 相同。您可以尝试将 SOVERSION 设置为空字符串。在重新配置/重建之前不要忘记删除旧文件。
  • 使用SOVERSION "" 生成“libclang.so”。没有 soname 的文件名
  • Hm,所以它实际上与 VERSION 设置相同。实际上,在第一种情况下(根本没有 VERSION 属性)so-version .7 仍然被创建,这看起来很奇怪。那个“7”的由来是什么...
  • 您可以尝试使用set_property 命令清除属性(与将属性设置为空字符串相反)。
  • 是的,拥有“.7”(没有明确设置)对我来说也很奇怪。我如何使用set_property 清除财产?你能举个例子吗? (我点击了您提供的链接,但我看不到如何清除该属性)。

标签: android cmake clang llvm


【解决方案1】:

我无法对此进行测试,但尝试设置 NO_SONAME 属性而不是其他修改。

set_target_properties(libclang
  PROPERTIES NO_SONAME 1
)

【讨论】:

  • 我仍然需要soname,但等于libclang.so(没有.7)。使用NO_SONAME 1 完全删除它。
  • 究竟删除了什么?所以你最终得到的是 libclang 而不是 libclang.so?如果您查看目标属性列表,您会看到您可以设置输出名称、后缀、版本。我猜想对于共享库,它使用 (output_name).(suffix).(version) 形成名称。您可能希望使用 NO_SONAME 的组合并将后缀设置为“.so”。
  • 我最终得到没有 soname 的“libclang.so”文件名。我需要“libclang.so”和“libclang.so”soname。
【解决方案2】:

感谢@Fred,我能够通过以下方式获得它(非常肮脏的技巧):

set_target_properties(libclang
  PROPERTIES
  #VERSION ${LIBCLANG_LIBRARY_VERSION}
  SUFFIX ""
  VERSION "so"
  SOVERSION "so"
  DEFINE_SYMBOL _CINDEX_LIB_)

我已经检查过它有正确的文件名和 soname:

~/llvm/build anton$ls -l lib/libclang.so
-rwxrwxr-x 1 anton anton 33590456 Nov 30 12:54 lib/libclang.so
~/llvm/build anton$arm-linux-androideabi-readelf --dynamic lib/libclang.so | grep SONAME
 0x0000000e (SONAME)                     Library soname: [libclang.so]

但是我不确定这是否是错误的,因为我还没有尝试加载它。

如果有合适的方法,请告诉我。

【讨论】:

  • 您最好通过电子邮件发送 CMake 邮件列表然后在这里询问。我知道一些 CMake 开发人员会监控邮件列表。
  • 我不认为这是一个非常具体的问题,我希望有一些我不知道的直接解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-12
  • 1970-01-01
  • 2015-02-26
  • 1970-01-01
  • 2021-01-14
相关资源
最近更新 更多