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