如何使用CMAKE将FFTW添加到Android项目中

How to add FFTW to an Android project using CMAKE

本文关键字:Android 项目 添加 FFTW 何使用 CMAKE      更新时间:2023-10-16

我正在尝试使用CMAKE将FFTW添加到我的Android项目中,但我无法这样做。如果有人成功地将FFTW添加到他们的Android项目中,我将非常感谢任何帮助,特别是如果它是通过cmake而不是ndk-build完成的。

以下是我目前在 CMakeLists.txt 文件中用于将 FFTW 添加到项目中的代码:

set(buildDir ${CMAKE_CURRENT_BINARY_DIR}/build)
add_subdirectory(C:/Users/reyna/Documents/HMC/Clinic/Test/fftw-3.3.8 ${buildDir})
set(
FFTW3_DIR ${buildDir}
CACHE PATH "Path to internally built FFTW3Config.cmake"
FORCE
)
find_package(FFTW3 CONFIG REQUIRED)

我收到以下错误消息:

CMake Error at .cxx/cmake/debug/armeabi-v7a/build/FFTW3Config.cmake:13 (include):
文件 C:/Users/reyna/Documents/HMC/Clinic/AmazonAppTest/Test2/app/.cxx/cmake/debug/armeabi-v7a/build/FFTW3LibraryDepends.cmake 由 export() 命令生成。它不能用作 include() 命令的参数。请改用 ALIAS 目标通过备用名称引用目标。

>

调用

堆栈(最近一次调用优先):
CMakeLists.txt:69 (find_package)
* 尝试:
使用 --stacktrace 选项运行以获取堆栈跟踪。使用 --info 或 --debug 选项运行以获取更多日志输出。使用 --scan 运行以获取完整的见解。
* 获取更多帮助 https://help.gradle.org
构建失败 1s
6 个可操作的任务:1 个已执行,5

个最新

有人知道如何解决错误吗?我不确定如何处理这个问题,因为它似乎来自 FFTW Cmake 文件。

编辑

因此,我能够在 CMAKE 中使用以下命令让 FFTW 以双精度(默认值)工作:

set(CMAKE_INSTALL_PREFIX C:/Users/reyna/Documents/HMC/Clinic/FFTW_Install)
set( FFTW3_DIR C:/Users/reyna/Documents/HMC/Clinic/fftw/fftw-3.3.8)
add_subdirectory(${FFTW3_DIR} ${CMAKE_CURRENT_BINARY_DIR}/fftw_build)
include_directories(C:/Users/reyna/Documents/HMC/Clinic/FFTW_Install/include/)
target_link_libraries (native-lib fftw3 AudioEngine log oboe android)

根据我对CMake的了解,我认为发生的事情如下:

  1. 第一个set()命令只是将CMAKE_INSTALL_PREFIX变量设置为我选择的位置。我现在不使用它,但它以后可能会有用。下面会详细介绍...

  2. 第二个set()命令将变量设置为计算机中 FFTW 的安装位置。

  3. add_subdirectory()命令运行位于 FTTW 安装目录中的 CMakeList.txt 文件,该文件将项目构建到${CMAKE_CURRENT_BINARY_DIR}/fftw_build指定的目录中,该目录位于app/.cxx/cmake/debug/${abi}/fftw_build中。由于 CMakeList.txt 文件中有一个add_library()命令,该命令可以创建一个 .so 库(对于 x86,由于某种原因它创建了一个 .a 库),我可以将我的本机库链接到该目标。我发现这些库被添加到app/build/intermediates/cmake/obj/${abi}文件夹中(x86 除外,由于某种原因将其添加到 fftw_build 文件夹中)。链接是使用上面显示的target_link_libraries()命令完成的。

  4. include_directories()命令使fftw3.h文件对项目可见。但是,除非您运行安装命令,否则不会将fftw3.h文件复制到 Android 项目中的任何位置。FFTW3 CMakeList.txt 文件有多个在构建时不会运行的安装命令。如果运行位于生成文件夹中的cmake_install.cmake文件,则会执行这些命令。您可以使用include()命令执行此操作。不确定这是否是通常的做法,但这就是我发现你可以做到的方式。我没有运行安装命令,因为我发现没有必要。

问题是,我想要单精度,我认为如果我只是将 FFTW3 CMakeList 文件中的ENABLE_FLOAT选项设置为ON.txt就可以获得。如果我这样做,并执行上面的步骤 1-3(同时链接到 fftw3f 而不是 fftw3),我会收到以下错误:

生成命令失败。
执行进程 C 时出错:\Users\reyna\AppData\Local\Android\Sdk\cmake\3.6.4111459\bin\cmake.exe 带有参数 {--build C:\Users\reyna\Documents\HMC\Clinic\AmazonAppTest\Test2\app.cxx\cmake\debug\armeabi-v7a --target native-lib} [1/1] 链接 CXX 共享库 .....\build\mediates\cmake\debug\obj\armeabi-v7a\libnative-lib.so失败: cmd.exe/C "cd .&& C:\Users\reyna\AppData\Local\Android\Sdkdk\20.0.5594570\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=armv7-none-linux-androideabi16 --gcc-toolchain=C:/Users/reyna/AppData/Local/Android/Sdk/ndk/20.0.5594570/toolchains/llvm/prebuilt/windows-x86_64 --sysroot=C:/Users/reyna/AppData/Local/Android/Sdk/ndk/20.0.5594570/toolchains/llvm/prebuilt/windows-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -fno-addrsig -march=armv7-a -mthumb -wa,--noexecstack -wformat -werror=format-security -O0 -fno-limit-debug-info -wl,--exclude-libs,libgcc.a -wl,--exclude-libs,libatomic.a -static-libstdc++ -wl,--build-id -wl,--warn-shared-textrel -wl,--fatal-warnings -wl,--exclude-libs,libunwind.a -wl,--no-undefined -Qunused-arguments -Wl,-z,noexecstack -shared -wl,-soname,libnative-lib.so -o ........\build\intermediates\cmake\debug\obj\armeabi-v7a\libnative-lib.so CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o -lfftw3f ../../../../build/intermediates/cmake/debug/obj/armeabi-v7a/libAudioEngine.so -llog -landroid ../../../../build/intermediates/cmake/debug/obj/armeabi-v7a/libCallback.so -llog ../../../../build/intermediates/cmake/debug/obj/armeabi-v7a/liboboe.so -latomic -lm && cd ." C:/Users/reyna/AppData/Local/Android/Sdk/ndk/20.0.5594570/toolchains/llvm/prebuilt/windows-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin\ld: error: 找不到 -lfftw3f

clang++:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

忍者:构建停止:子命令失败。

我让单精度构建工作,但它不是一个很好的解决方案,因为我认为如果我做"清理项目"或"刷新链接C++项目"之类的东西,它将不再工作,我将不得不重复我将在下面描述的过程:

1)我在问题中指定的CMake参数仍然相同。但是,我进入了FFTW3的CMakeLists.txt并将ENABLE_FLOAT选项设置为ON。在此过程的此时,单个精度更改将仅反映在 x86 ABI 版本中。所以,当我尝试构建项目时,Android Studio 会抱怨找不到 armeabi-v7a 构建的 fftw3f 库。
2)我提出了一个我之前见过的想法,我们需要为每个ABI构建FFTW3,所以我在defaultConfig{}中的build.gradle文件中添加了以下内容:

externalNativeBuild {
cmake {
arguments "-DANDROID_ABI=x86_64"
abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
}
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
}

我将 -DANDROID_ABI 标志更改为我想要构建的 ABI。我真的不确定是否需要 abiFilters 的东西,但我非常有信心需要参数标志。我目前已经注释掉了 abiFilter 的东西,因为在将我的应用程序安装到我的手机中后,我会收到关于找不到我的本机库的错误。
3)我用每个ABI标志构建了Android项目,这有点麻烦,所以也许我需要做构建多个apks方法。