Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何强制CMake在共享库文件名和soname中不添加主要/次要版本?_Android_Cmake_Clang_Llvm - Fatal编程技术网

Android 如何强制CMake在共享库文件名和soname中不添加主要/次要版本?

Android 如何强制CMake在共享库文件名和soname中不添加主要/次要版本?,android,cmake,clang,llvm,Android,Cmake,Clang,Llvm,我正在使用Cmake for Android(使用Android NDK)编译libclang 以下是配置文件名和soname的CMake配置部分: set_target_properties(libclang PROPERTIES VERSION ${LIBCLANG_LIBRARY_VERSION} DEFINE_SYMBOL _CINDEX_LIB_) ~/llvm/build anton$ls -l lib/libclang.so -rwxrwxr-x 1 an

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

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

set_target_properties(libclang
    PROPERTIES
    VERSION ${LIBCLANG_LIBRARY_VERSION}
    DEFINE_SYMBOL _CINDEX_LIB_)
~/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]
在不同的文件中:

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

因为我编译了版本为“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]
我如何避免在filename和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.”(末尾有点)


我能做什么?

我无法测试这个,但尝试设置NO\u SONAME属性,而不是其他修改

set_target_properties(libclang
  PROPERTIES NO_SONAME 1
)

多亏了@Fred,我才得以通过以下(非常肮脏的伎俩)获得它:

我已检查它是否具有正确的文件名和名称:

set_target_properties(libclang
    PROPERTIES
    VERSION ${LIBCLANG_LIBRARY_VERSION}
    DEFINE_SYMBOL _CINDEX_LIB_)
~/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]
但是我不确定smth是否错误,因为我还没有尝试加载它


请告诉我是否有合适的方法。我仍然需要soname,但等于
libclang.so
(不含
.7
)。使用
NO\u SONAME 1
完全删除它。删除什么?所以你最后是Libblang而不是Libblang,所以?如果查看目标属性列表,您将看到可以设置outputname、后缀和版本。我猜对于共享库,它是使用(output_name)。(后缀)。(版本)来形成名称的。您可能希望结合使用NO_SONAME,并将后缀设置为“.so”。我最终得到的是没有SONAME的“libclang.so”文件名。我需要“libclang.so”加上“libclang.so”的soname。你最好先发邮件给CMake邮件列表,然后在这里询问。我知道一些CMake开发人员监控邮件列表。我不认为这是一个非常具体的问题,我希望有一些我不知道的直截了当的解决方案。在
.so
之后的数字称为so版本,CMake属性对此负责。请注意,如果缺少此属性,但存在版本1,则假定SOVERSION与版本相同。您可以尝试将SOVERSION设置为空字符串。在重新配置/重建之前,不要忘记删除旧文件。使用
SOVERSION”“
生成“libclang.so.”文件名,而不使用sonameHm,因此它实际上与版本设置相同。实际上,在第一个场景中(根本没有版本属性),仍然创建了版本
.7
。“7”的来源是什么?您可以尝试使用命令清除属性(与将属性设置为空字符串相反)。是的,拥有“.7”(没有显式设置)对我来说也很奇怪。如何使用
set\u property
清除属性?你能举个例子吗。(我遵循了您提供的链接,但我不知道如何清除该属性)。