Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android CMake链接静态库错误,而NDK工作正常_Android_C++_C_Android Ndk_Cmake - Fatal编程技术网

Android CMake链接静态库错误,而NDK工作正常

Android CMake链接静态库错误,而NDK工作正常,android,c++,c,android-ndk,cmake,Android,C++,C,Android Ndk,Cmake,我正试图在最新的Android Studio中使用CMake构建我的本地库。我为此准备了gradle脚本,没有任何问题,但我发现了一个小问题——我无法为x86 arch编译我的库 前一段时间。。。 我的库使用OpenSSL AES/DES加密/解密。我按原样编译了OpenSSL 1.0.2k(静态库),将其链接到我的共享库,除x86 arch外一切正常-当设备上的dlopen时,出现了一个错误共享库文本段不可共享。然后我用-fPIC标志重新编译OpenSSL,再次链接它,错误消失了。我是用NDK

我正试图在最新的Android Studio中使用CMake构建我的本地库。我为此准备了gradle脚本,没有任何问题,但我发现了一个小问题——我无法为x86 arch编译我的库

前一段时间。。。 我的库使用OpenSSL AES/DES加密/解密。我按原样编译了OpenSSL 1.0.2k(静态库),将其链接到我的共享库,除x86 arch外一切正常-当设备上的
dlopen
时,出现了一个错误
共享库文本段不可共享。然后我用
-fPIC
标志重新编译OpenSSL,再次链接它,错误消失了。我是用NDK 13b建造的

现在。。。 我正在尝试从NDK迁移到CMake,因为它对我来说有更多的功能,Android Studio通常只能使用CMake自动完成和lint C/C++代码。我写了
CMakeList.txt
,它可以正常工作,但
共享库文本段不可共享的问题再次出现
,但在CMake构建过程的链接步骤上。错误:

D:/User/AppData/Local/Android/sdk/ndk-bundle/toolchains/x86-4.9/prebuilt/windows-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/bin\ld: warning: shared library text segment is not shareable
  D:/User/AppData/Local/Android/sdk/ndk-bundle/toolchains/x86-4.9/prebuilt/windows-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/bin\ld: error: treating warnings as errors
我已禁用将此警告视为错误,并在设备上再次出现
dlopen
时出现
shared library text segment not sharedable

有什么问题?为什么NDK构建时没有任何问题而CMake没有

另外,我尝试了不同的
CMAKE
标志(例如
CMAKE\u POSITION\u INDEPENDENT\u code
),但没有任何效果。此问题仅适用于
x86
arch

CMakeLists.txt(x86的生成失败,其他所有-无问题):

Android.mk(NDK14b,所有ARCH-无问题):

提前感谢您的帮助

set(CMAKE_SHARED_LINKER_FLAGS "-Wall -v -Wl, --no-warn-shared-textrel")

这个确切的工具Cain将警告视为错误,因此只需添加此工具即可抑制警告--no warn shared textrel是关键

解决方案是我需要编译带有
无asm
标志的OpenSSL。之后,OpenSSL链接并在x86 arch上正常工作。

仅在x86中,添加--no warn shared textrel,您应该将其添加到CMakeList.txt:

如果(${ANDROID_ABI}STREQUAL“x86”)
设置(CMAKE_共享链接器_标志“${CMAKE_共享链接器_标志}-Wl,--no warn SHARED textrel”)
endif()


祝你好运。

1<代码>--no warn shared textrel
是CMake 2的未知选项。如果从链接器标志中删除将警告视为错误,则在调用
System.loadLibrary
时,会在x86设备上获得
library has text rellocations
。这就是为什么不是我的解决方案。在链接器标志
set之前添加
set(CMAKE_CXX_标志${CMAKE_CXX_标志}-std=gnu++11”)
set(CMAKE_CXX_标志${CMAKE_CXX_标志}-std=gnu++11”)
没有帮助,这将生成不会加载的二进制文件,如果您针对较新版本的Android:。编译此库后,但在x86设备上运行时发生崩溃:
java.lang.unsatifiedLinkError:dlopen失败:具有文本重定位功能
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_SRC_FILES := $(LOCAL_PATH)/static/$(TARGET_ARCH_ABI)/libcrypto.a
LOCAL_MODULE := crypto
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_SRC_FILES := $(LOCAL_PATH)/static/$(TARGET_ARCH_ABI)/libssl.a
LOCAL_MODULE := ssl
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LCOAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_SRC_FILES := test.c
LOCAL_MODULE := testlib
LOCAL_STATIC_LIBRARIES := crypto ssl

include $(BUILD_SHARED_LIBRARY)
set(CMAKE_SHARED_LINKER_FLAGS "-Wall -v -Wl, --no-warn-shared-textrel")