調用OpenSSL報錯:libcrypto.a(armcap.o):armcap.c:undefined reference to 'sigfillset'

在調用OpenSSL的某些函數的時候,編譯後報錯如下:

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:externalNativeBuildDebug'.
> Build command failed.
  Error while executing process /Users/BLT/Develop/adt-bundle-mac-x86_64-20140702/android-sdk-macosx/cmake/3.6.4111459/bin/cmake with arguments {--build /Users/BLT/Downloads/OpenSSL/TestOpenSsl/app/.externalNativeBuild/cmake/debug/armeabi-v7a --target native-lib}
  [1/3] Building C object CMakeFiles/native-lib.dir/gmssl-armeabi-v7a/GmsslCertTools.c.o
  [2/3] Building CXX object CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o
  [3/3] Linking CXX shared library ../../../../build/intermediates/cmake/debug/obj/armeabi-v7a/libnative-lib.so
  FAILED: : && /Users/BLT/Develop/adt-bundle-mac-x86_64-20140702/android-sdk-macosx/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++  --target=armv7-none-linux-androideabi --gcc-toolchain=/Users/BLT/Develop/adt-bundle-mac-x86_64-20140702/android-sdk-macosx/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64 --sysroot=/Users/BLT/Develop/adt-bundle-mac-x86_64-20140702/android-sdk-macosx/ndk-bundle/sysroot -fPIC -isystem /Users/BLT/Develop/adt-bundle-mac-x86_64-20140702/android-sdk-macosx/ndk-bundle/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=14 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -fno-integrated-as -mthumb -Wa,--noexecstack -Wformat -Werror=format-security   -O0 -fno-limit-debug-info  -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a --sysroot /Users/BLT/Develop/adt-bundle-mac-x86_64-20140702/android-sdk-macosx/ndk-bundle/platforms/android-14/arch-arm -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libnative-lib.so -o ../../../../build/intermediates/cmake/debug/obj/armeabi-v7a/libnative-lib.so CMakeFiles/native-lib.dir/gmssl-armeabi-v7a/GmsslCertTools.c.o CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o  ../../../../gmssl-armeabi-v7a/libs/libcrypto.a -llog -latomic -lm "/Users/BLT/Develop/adt-bundle-mac-x86_64-20140702/android-sdk-macosx/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/libgnustl_static.a" && :
  ../../../../gmssl-armeabi-v7a/libs/libcrypto.a(armcap.o):armcap.c:function OPENSSL_cpuid_setup: error: undefined reference to 'sigfillset'
  ../../../../gmssl-armeabi-v7a/libs/libcrypto.a(armcap.o):armcap.c:function OPENSSL_cpuid_setup: error: undefined reference to 'sigdelset'
  ../../../../gmssl-armeabi-v7a/libs/libcrypto.a(armcap.o):armcap.c:function OPENSSL_cpuid_setup: error: undefined reference to 'sigdelset'
  ../../../../gmssl-armeabi-v7a/libs/libcrypto.a(armcap.o):armcap.c:function OPENSSL_cpuid_setup: error: undefined reference to 'sigdelset'
  ../../../../gmssl-armeabi-v7a/libs/libcrypto.a(armcap.o):armcap.c:function OPENSSL_cpuid_setup: error: undefined reference to 'sigdelset'
  ../../../../gmssl-armeabi-v7a/libs/libcrypto.a(ui_openssl.o):ui_openssl.c:function read_string_inner: error: undefined reference to 'signal'
  ../../../../gmssl-armeabi-v7a/libs/libcrypto.a(ui_openssl.o):ui_openssl.c:function read_string_inner: error: undefined reference to 'tcsetattr'
  ../../../../gmssl-armeabi-v7a/libs/libcrypto.a(ui_openssl.o):ui_openssl.c:function read_string_inner: error: undefined reference to 'tcsetattr'
  ../../../../gmssl-armeabi-v7a/libs/libcrypto.a(ui_openssl.o):ui_openssl.c:function open_console: error: undefined reference to 'tcgetattr'
  clang++: error: linker command failed with exit code 1 (use -v to see invocation)
  ninja: build stopped: subcommand failed.


* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

* Get more help at https://help.gradle.org

BUILD FAILED in 2s

原因:

sigdelset, sigfillset, signal這些方法在Android的sdk中找不到,雖然已經#include <signal.h>,還是無效。

查看signal.h文件中的相關方法,可見這些方法是api21引入的,需要在api大於21的時候才能調用這些函數,我當前使用的TargetAPI是26,仍然有這個問題,我原來的minSdkVersion是14,那就是minSdkVersion的問題了,改爲21,再編譯則不會報上面錯誤:

#if __ANDROID_API__ >= __ANDROID_API_L__
sighandler_t signal(int __signal, sighandler_t __handler) __INTRODUCED_IN(21);
int sigaddset(sigset_t* __set, int __signal) __INTRODUCED_IN(21);
int sigdelset(sigset_t* __set, int __signal) __INTRODUCED_IN(21);
int sigemptyset(sigset_t* __set) __INTRODUCED_IN(21);
int sigfillset(sigset_t* __set) __INTRODUCED_IN(21);
int sigismember(const sigset_t* __set, int __signal) __INTRODUCED_IN(21);
#else
// Implemented as static inlines before 21.
#endif

解決方法:

在app中修改minSdkVersion爲21之後的版本號即可:

android {
    compileSdkVersion 26
    buildToolsVersion '26.0.3'
    defaultConfig {
        applicationId "com.test.tt"
        minSdkVersion 21
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags ""
            }
        }
        ndk {
            abiFilters 'armeabi-v7a'
//            abiFilters 'arm64-v8a'
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章