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

时间:2018-11-30 07:19:20

标签: android cmake clang llvm

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

这是CMake配置的一部分,用于配置文件名和soname:

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”。 (末尾有点)。

我该怎么办?

2 个答案:

答案 0 :(得分:1)

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

set_target_properties(libclang PROPERTIES NO_SONAME 1 )

答案 1 :(得分:0)

由于@Fred,我可以通过以下方法(确实是肮脏的把戏)获得它:

set_target_properties(libclang
  PROPERTIES
  #VERSION ${LIBCLANG_LIBRARY_VERSION}
  SUFFIX ""
  VERSION "so"
  SOVERSION "so"
  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是否错误,因为我还没有尝试加载它。

请让我知道是否有适当的方法。