gcc aarch64 Android缺少标准库交叉编译

hmmo2u0o  于 2022-11-24  发布在  Android
关注(0)|答案(1)|浏览(359)

在我的主机系统(Ubuntu,64 Bit)上,我使用gcc/g++编译器为我的Android应用(arm 64-v8 a)交叉编译我的库。在从我的应用调用函数时,我收到消息说找不到像libc.so.6libstdc++.so.6这样的库。
在我的/usr目录中,我有一个包含binincludelib文件夹的aarch64-linux-gnu文件夹。

CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.6.0)

set(CMAKE_TOOLCHAIN_FILE android.toolchain.cmake)

project(testlibrary)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STYANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# find header & source
file(GLOB_RECURSE SOURCE_CPP "src/*.cpp")
file(GLOB_RECURSE HEADER "src/*.h")

add_library(${PROJECT_NAME}  SHARED
  ${SOURCE_CPP}
  ${HEADER}
)

source_group("Header include" FILES ${HEADER})
source_group("Source src"     FILES ${SOURCE_CPP})

安卓.工具链.cmake:

cmake_minimum_required(VERSION 3.6.0)

set(CMAKE_SYSTEM_NAME Android)
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_ANDROID_ARCH_ABI arm64-v8a)

set(CMAKE_C_COMPILER "aarch64-linux-gnu-gcc")
set(CMAKE_CXX_COMPILER "aarch64-linux-gnu-g++")
set(CMAKE_ANDROID_NDK /home/ubuntu/Android/Sdk/ndk/21.4.7075529)

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

错误消息如下:

dlopen failed: library "libc.so.6" not found: needed by /my/lib/path/testlib.so in namespace classloader-namespace

dlopen failed: library "libstdc++.so.6" not found: needed by /my/lib/path/testlib.so in namespace classloader-namespace

我是否必须设置Sysroot或其他路径,以便在工具链文件中找到我的库?我应该使用哪个路径?

**EDIT 1:**将aarch64-linux-gnu文件夹添加到我的构建目录并显式包含

target_link_libraries($PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_LIST_DIR}/aarch64-linux-gnu/lib/libstdc++.so.6)
# also any other lib, e.g. libstdc++.so, libc.so and libc.so.6 don't work

仍然会导致上述错误消息。
我使用下面的.cpp.hpp文件做了一个最小的错误示例,在这种情况下会导致libc.so.6 not found。删除malloc行也会删 debugging 误消息。调用testFunc也会将正确的值返回到我的应用程序,我可以显示该值。src_file.cpp

#include "header_file.hpp"
#include <stdlib.h> // for malloc
int testFunc_(){
  char* buffer;
  buffer = (char *) malloc (10);
  return 42;
}

文件头.hpp

extern "C" int testFunc_();

我还在我的android.toolchain.cmake文件中添加了以下行(我将文件夹从/usr/aarch 64/linux-gnu/复制到了我的构建目录)

set(CMAKE_SKIP_BUILD_RPATH FALSE)
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
set(CMAKE_INSTALL_RPATH "")
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE)

set(LDFLAGS="-Wl,-rpath,../aarch64-linux-gnu/lib")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LDFLAGS}" CACHE INTERNAL "" FORCE)
set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} ${LDFLAGS}" CACHE INTERNAL "" FORCE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LDFLAGS}" CACHE INTERNAL "" FORCE)
set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} ${LDFLAGS}" CACHE INTERNAL "" FORCE)

**编辑2:**运行readelf -d 'path/to/lib'时第一个标记

Tag         Type            Name/Value
0x000...1   (NEEDED)        Shared library: [libc.so.6]

,但看不到任何RUNPATHRPATH标记。

htzpubme

htzpubme1#

您要么需要将这些库静态链接到可执行文件中(链接时-static可能有效),要么需要将它们与可执行文件一起提供,并将它们放在可执行文件可以找到它们的地方,比如在同一目录中。
我对Android不是很熟悉,但也可能有一种方法让目标Android系统在运行时提供这些库,因为它们非常常见,使用广泛。

相关问题