Rob*_*Rob 4 linker openssl linker-errors android-ndk
我对Android,编译和链接都很新.我不知道哪些细节对我的问题很重要,所以我会告诉你一切.如果您发现任何奇怪或不正确的内容,请告诉我们.
我在Android-NDK中构建了libcrypto.so和libssl.so库.我编写了使用openssl.so中的函数的本机代码(而openssl.so使用了libssl.so中的函数).代码编译,但是在链接时我收到"未定义的引用"错误:
./obj/local/armeabi/objs/pki_send/pki_send.o: In function `main':
/home/android/nativeserver/jni/pki_send.c:27: undefined reference to `RSA_generate_key'
collect2: ld returned 1 exit status
make: *** [obj/local/armeabi/pki_send] Error 1
Run Code Online (Sandbox Code Playgroud)
我在Google上搜索并找到了一个与我有同样问题的人,她甚至调用相同的功能(除了这个人不是为Android构建):http://ubuntuforums.org/showthread.php?t = 1081028.我会在这里引用她的帖子中与我的问题相关的部分:
当我删除一个参数[对导致"未定义引用"的函数]时,编译器说参数太少,当我添加一个参数时,编译器说有太多的参数,所以看起来有"某种"类型的参考正确的功能.也许有一些错误的链接?
我注意到了同样的行为.她通过使用-lssl设置进行编译来解决她的问题,该设置告诉编译器使用openssl库.对我来说,我改变了Android.mk文件中的模块:
LOCAL_LDLIBS += -ldl
Run Code Online (Sandbox Code Playgroud)
对此:
LOCAL_LDLIBS += -lssl -lcrypto -ldl
Run Code Online (Sandbox Code Playgroud)
我包括-lcrypto只是为了安全,因为libssl依赖于libcrypto.现在,当我运行ndk-build时,收到以下错误:
/home/android/android-ndk-r8/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.4.3/../../../../arm-linux-androideabi/bin/ld: cannot find -lssl
collect2: ld returned 1 exit status
make: *** [obj/local/armeabi/pki_send] Error 1
Run Code Online (Sandbox Code Playgroud)
此错误显示"ld"找不到libssl.so.我的jni目录中有libcrypto.so和libssl.so.理想情况下,我想找到一种方法将jni目录添加到"ld"的搜索路径中,但我无法弄清楚这一点.我试图通过将libssl.so和libcrypto.so添加到以下目录来解决这个问题:/ android-ndk-r8/platforms/android-8/arch-arm/usr/lib(我相信"ld"在这里搜索库).一旦我这样做,我再次运行ndk-build并收到"未定义的引用"错误:
./obj/local/armeabi/objs/pki_send/pki_send.o: In function `main':
/home/android/nativeserver/jni/pki_send.c:27: undefined reference to `RSA_generate_key'
collect2: ld returned 1 exit status
make: *** [obj/local/armeabi/pki_send] Error 1
Run Code Online (Sandbox Code Playgroud)
从这里开始,我对如何进行一无所知.
万一它很重要,这是我的Android.mk文件中的代码:
LOCAL_PATH := $(call my-dir)
APP_PLATFORM := android-8
include $(CLEAR_VARS)
LOCAL_MODULE := crypto
LOCAL_SRC_FILES := libcrypto.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../include/
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := ssl
LOCAL_SRC_FILES := libssl.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../include/
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := pki_send.c
LOCAL_MODULE := pki_send
LOCAL_SHARED_LIBRARIES := ssl crypto
LOCAL_LDLIBS += -lssl -lcrypto -ldl
LOCAL_MODULE_TAGS := optional
include $(BUILD_EXECUTABLE)
Run Code Online (Sandbox Code Playgroud)
编辑:我忘记添加的东西:当我在libcrypto.so中使用我的本机代码中的函数时,代码编译和链接很好.似乎我可以在libcrypto.so中使用任何函数.但是,给我带来问题的功能是在libssl.so中.这可能重要也可能不重要.
我解决了这个问题.我调用的函数"RSA_generate_key"仅存在于libcrypto.so的弃用版本中.我使用的是使用"RSA_generate_key_ex"的新版本.我在libcrypto.so上做了一个readelf我发现了这个:
$ ./arm-linux-androideabi-readelf -all ~/nativeserver/jni/libcrypto.so |grep RSA_generate
679: 00089239 992 FUNC GLOBAL DEFAULT 7 RSA_generate_key_ex
10334: 00089239 992 FUNC GLOBAL DEFAULT 7 RSA_generate_key_ex
Run Code Online (Sandbox Code Playgroud)
程序仍然编译的原因是因为RSA_generate_key在openssl/rsa.h的头文件中,即使库没有它.
| 归档时间: |
|
| 查看次数: |
4476 次 |
| 最近记录: |