在我的主机系统(Ubuntu,64 Bit)上,我使用gcc/g++
编译器为我的Android应用(arm 64-v8 a)交叉编译我的库。在从我的应用调用函数时,我收到消息说找不到像libc.so.6
或libstdc++.so.6
这样的库。
在我的/usr
目录中,我有一个包含bin
、include
和lib
文件夹的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]
,但看不到任何RUNPATH
或RPATH
标记。
1条答案
按热度按时间htzpubme1#
您要么需要将这些库静态链接到可执行文件中(链接时
-static
可能有效),要么需要将它们与可执行文件一起提供,并将它们放在可执行文件可以找到它们的地方,比如在同一目录中。我对Android不是很熟悉,但也可能有一种方法让目标Android系统在运行时提供这些库,因为它们非常常见,使用广泛。