gpt4 book ai didi

Android.mk 无法与 libcrypto 链接

转载 作者:太空狗 更新时间:2023-10-29 15:07:02 26 4
gpt4 key购买 nike

案例:

我正在构建一个使用 libcryptolibssl 的应用程序。我正在尝试使用预构建的 libcrypto.solibssl.so 并编译我的应用程序。

但我不断收到 undefined reference 错误。

我的应用/Android.mk

LOCAL_PATH := $(call my-dir)
my_LOCAL_PATH := $(LOCAL_PATH)
include $(call all-subdir-makefiles)
LOCAL_PATH := $(my_LOCAL_PATH)
common_SRC_FILES := \
src/foo.c
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(common_SRC_FILES)
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../openssl/include
LOCAL_SHARED_LIBRARIES += mylibssl mylibcrypto
include $(BUILD_STATIC_LIBRARY)

我的应用/mylibssl/Android.mk

构建 mylibssl [从预构建的 libssl.so]

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mylibssl
LOCAL_SRC_FILES := libssl.so
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_SUFFIX := .so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../openssl/include
include $(BUILD_PREBUILT)

我的应用/mylibcrypto/Android.mk

构建 mylibcrypto [从预构建的 libcrypto.so]

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mylibcrypto
LOCAL_SRC_FILES := libcrypto.so
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_SUFFIX := .so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../openssl/include
include $(BUILD_PREBUILT)

我不断得到

error: undefined reference to 'BIO_new_mem_buf'
error: undefined reference to 'PEM_read_bio_X509_AUX'
error: undefined reference to 'BIO_free'
...

我花了几个小时试图弄清楚,但完全被困住了。请帮忙!

最佳答案

I am building an app which uses libcrypto and libssl... But I keep getting undefined reference errors.

error: undefined reference to 'BIO_new_mem_buf'
error: undefined reference to 'PEM_read_bio_X509_AUX'
error: undefined reference to 'BIO_free'

这些是链接器错误,意味着您没有链接到 OpenSSL 库。这可能是一个路径问题,假设您有可用的 OpenSSL 库的 Android 版本。


如果您需要 Android 版本的 OpenSSL 库,那么您可以自己构建它或在 Github 上找到它。要自己构建它,请参阅 FIPS Library and Android (忽略 FIPS 的东西)。所需的步骤是(并在运行脚本时注意前导点“.”):

cd openssl-1.0.1f/
wget http://wiki.openssl.org/images/7/70/Setenv-android.sh
chmod a+x *.sh
. ./setenv-android.sh

./config shared no-ssl2 no-hw no-engine --openssldir=/usr/local/ssl/android-18/ <other options>
make depend
make all

对于选项二,你可以用https://www.google.com/q=openssl+android+site:github.com搜索Github。 .


Building mylibcrypto [from a prebuilt libcrypto.so]

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mylibcrypto
LOCAL_SRC_FILES := libcrypto.so

这不会产生预期的结果,如果您让它工作,可能会导致崩溃。问题是 Android 使用 0.9.8,而您可能是针对 1.0.1 构建的。

发生的事情是 Zygote 在启动时加载 OpenSSL 0.9.8(它是所有 Android Java 程序的父级)。当您的应用程序启动时,Zygote 被 fork ,因此 OpenSSL 已经映射到地址空间。这意味着您随身携带的 OpenSSL 版本未加载。后来,你崩溃了,因为 0.9.8 和 1.0.1 不是二进制兼容的(即,它们是 ABI 不兼容的)。

您在构建包装器共享对象 (mylibcrypto.so) 方面是正确的。但是,mylibcrypto.so 将需要针对 OpenSSL 进行静态链接以避免上述问题。也就是说,mylibcrypto.so 需要链接到 libcrypto.alibssl.a

关于Android.mk 无法与 libcrypto 链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21039729/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com