我成功地为arm、arm64、x86和x86_64架构编译了Freetype2库。以下是我编译它所采取的步骤。
- Created standalone toolchains for architectures mentioned above.
make_standalone_toolchain.py \ --arch arm64 \ --api 26 \ --stl=libc++ \ --install-dir=my-arm64-toolchain
Set some envirement variables
export PATH=$PATH:`pwd`/my-toolchain/bin target_host=aarch64-linux-android export AR=$target_host-ar export AS=$target_host-as export CC=$target_host-gcc export CXX=$target_host-g++ export LD=$target_host-ld export STRIP=$target_host-strip export CFLAGS="-fPIE -fPIC" export LDFLAGS="-pie"
Configure freetype for compilation
./configure --host=aarch64-linux-android --prefix=/home/freetype-arm64 --without-zlib --without-harfbuzz --with-png=no
- 最后进行编译并安装
编译成功后,我得到了静态的freetype库。
我将库添加到我的Android Studio libs文件夹中。 以下是库的文件夹结构:
libs---freetype
|---${ANDROID_ABI}
|---include
|---freetype2
|---freetype
---|Bunch of header files
|---ftbuild.h
|---lib
|---libfreetype.a
以下是我的CMakeLists.txt文件:
cmake_minimum_required(VERSION 3.4.1)
add_definitions("-DGLM_FORCE_SIZE_T_LENGTH -DGLM_FORCE_RADIANS")
add_subdirectory(src/main/cpp/glm)
add_library(freetype STATIC IMPORTED)
set_target_properties(freetype PROPERTIES IMPORTED_LOCATION${PROJECT_SOURCE_DIR}/libs/freetype/${ANDROID_ABI}/lib/libfreetype.a)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11 -Wall")
add_library(native-lib SHARED
src/main/cpp/native-lib.cpp
src/main/cpp/graph.cpp
src/main/cpp/text.cpp
src/main/cpp/graphDataWorker.cpp
)
target_include_directories(native-lib PRIVATE ${PROJECT_SOURCE_DIR}/libs/freetype/${ANDROID_ABI}/include/freetype2)
target_link_libraries(native-lib
android
freetype
GLESv2
EGL
glm
atomic
log
OpenSLES
)
问题在于我可以在代码中使用库,而且Android Studio没有给出任何错误提示,但是当我尝试运行应用程序时,它会给出以下错误提示:
链接器命令失败,退出代码为1(使用-v查看调用)
。PS:我在Android Studio文件树中也看不到freetype头文件,但可以看到其他库。
问题:我导入库的方式有误还是这是交叉编译问题?如果是后者,如何正确处理?我已经对此问题进行了大量研究,但未能找到解决方案。非常感谢您的帮助。
ld: ../../../../libs/freetype/arm64-v8a/lib/libfreetype.a(ftinit.o): Relocations in generic ELF (EM: 62) ../../../../libs/freetype/arm64-v8a/lib/libfreetype.a: error adding symbols: File in wrong format
,而EM:62代表x86_64。也许编译过程正在使用错误的库进行链接?这是可能的吗? - Vygintas B