【问题标题】:arm-linux-androideabi/bin/ld: fatal error: -soname: must take a non-empty argumentarm-linux-androideabi/bin/ld:致命错误:-soname:必须采用非空参数
【发布时间】:2014-11-10 10:28:03
【问题描述】:

我正在用 cmake android 交叉编译 gdcm,直到编译结束,但最后我得到以下错误。你们如何在编译库时在 cmake-gui 或 cmake 中设置 -soname,这样我们就可以避免出现以下错误。

/opt/android/android-ndk-r10c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.9/../../../../arm-linux-    androideabi/bin/ld: fatal error: -soname: must take a non-empty argument
collect2: error: ld returned 1 exit status
make[2]: *** [/home/likewise-open/SLKTECHLABS/kirtan.patel/Desktop/GDCM/GDCMSource/libs/armeabi-v7a/libgdcmjni.so] Error 1
make[1]: *** [Wrapping/Java/CMakeFiles/gdcmjni.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
/home/kirtan.patel/Desktop/GDCM/GDCMSource/Source/MediaStorageAndFileFormat/gdcmImageWriter.h:36: Warning 822: Covariant return     types not supported in Java. Proxy method will return gdcm::Pixmap const &.
/home/kirtan.patel/Desktop/GDCM/GDCMSource/Source/MediaStorageAndFileFormat/gdcmImageCodec.h:45: Warning 473: Returning a     pointer or reference in a director method is not recommended.

【问题讨论】:

  • 您需要发送make VERBOSE=1 的输出,因为您的输出仅包含警告(而非错误)
  • 你用的是什么版本的cmake?我对另一个产品有同样的错误。原来 cmake 3.2.3 是有问题的部分 - 我降级到 3.0.2,然后错误就消失了。

标签: android c++ android-ndk cmake


【解决方案1】:

正如Romanski 指出的那样,由于UseSWIG.cmake 文件的差异,CMake 版本 3.2 和 3.0 具有不同的行为。在 3.2 中,defaultNO_SONAME 属性 enabled 看起来会在 android 构建中引发冲突,从而产生无效的链接选项 -Wl,-soname, 和空的 TARGET_SONAME。

有两种方法可以修复 3.2 版本的构建

  1. string(REPLACE "<CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG><TARGET_SONAME>" "" CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE}") 完全消除了断开的链接选项
  2. set_target_properties(${MY_TARGET} PROPERTIES NO_SONAME OFF) 使用正确的名称修复损坏的链接选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 2016-03-02
    • 1970-01-01
    • 2013-07-28
    相关资源
    最近更新 更多