我想将从源代码构建的静态 fftw3 库链接到我的本机 Android Studio 应用程序。因此,我包含了标头并将
libfftw3.a
(Mach-O 64 位对象 arm64)添加到我的 jniLibs/arm64-v8a/
文件夹中。我将库与 CMake 链接起来:
set(VENDOR_LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../jniLibs/arm64-v8a)
add_library(fftw STATIC IMPORTED)
set_target_properties( fftw PROPERTIES IMPORTED_LOCATION ${VENDOR_LIB_DIR}/libfftw3.a )
target_link_libraries( exec fftw )
在我的
build.gradle
中,我添加了以下 C++ 标志:
defaultConfig {
applicationId "com.example.demo"
minSdk 33
targetSdk 33
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
arguments "-DCMAKE_TOOLCHAIN_FILE=/Users/username/Library/Android/sdk/ndk/25.2.9519653/build/cmake/android.toolchain.cmake",
"-DANDROID_PLATFORM=33",
"-DAPP_PLATFORM=33",
"-DANDROID_ABI=arm64-v8a"
cppFlags "-L/Users/username/AndroidStudioProjects/demo/app/src/main/cpp/fftw-3.3.10/.libs/ -lfftw3 -lm "
}
}
ndk {
abiFilters 'arm64-v8a'
}
}
但是,在使用
#include "fftw-3.3.10/api/fftw3.h"
将库包含在我的 exec 中之后,只要我想调用相关函数ld: error: undefined symbol: fftw_malloc
,我就会收到以下错误。我知道该应用程序未正确链接到库,但我不知道它出了什么问题,因为我可以通过这种方式成功链接其他第三方库。
我可以通过将 FFTW3 作为子目录来解决这个问题:
add_subdirectory(fftw-3.3.10)
include_directories(fftw-3.3.10/api)
然后将其直接链接到可执行文件,而不将其添加为静态库:
target_link_libraries( exec fftw3 )