【问题标题】:How to add FFTW to an Android project using CMAKE如何使用 CMAKE 将 FFTW 添加到 Android 项目
【发布时间】:2019-10-29 08:03:50
【问题描述】:

我正在尝试使用 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)

我收到以下错误消息:

.cxx/cmake/debug/armeabi-v7a/build/FFTW3Config.cmake:13(包括)处的 CMake 错误:
文件 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获得更多帮助
1 秒内构建失败
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 库),我可以将我的 native-lib 链接到该目标。我发现这些库被添加到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.txt 文件中的 ENABLE_FLOAT 选项设置为 ON 就可以得到。如果我这样做,并执行上面的步骤 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\intermediates\cmake\debug\obj\armeabi-v7a\libnative-lib.so 失败:cmd.exe /C "cd . && C:\Users\reyna\AppData\Local\Android\Sdk\ndk\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: 错误:找不到-lfftw3f

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

ninja:构建停止:子命令失败。

【问题讨论】:

  • FFTW 附带了一个 CMakeLists.txt,所以你不能用include_subdirectory(fftw3) 加载它,然后用target_link_libraries 链接你的Android 库吗?
  • 欢迎来到 Stackoverflow!请发布minimal, complete example,展示您的 CMake到目前为止 的样子,并记录您尝​​试过的内容。如果您有任何错误消息,请在您的问题帖中包含它们。
  • @Botje 我相信命令是add_subdirectory(fftw3)
  • 问题帖已修复,现在包含有关问题的更多详细信息。投票支持重新开放。
  • 对于使用 3d 方包,可以使用 either add_subdirectory 方法 find_package。在大多数情况下,混合使用这些方法是行不通的。

标签: c++ cmake android-ndk fftw


【解决方案1】:

我让单精度构建工作,但它不是一个很好的解决方案,因为我认为如果我执行“清理项目”或“刷新链接 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 的东西,因为在将我的应用程序安装到我的手机后我会收到关于找不到我的 native-lib 的错误。
3) 我用每个 ABI 标志构建了 Android 项目,这有点麻烦,所以也许我需要使用 build multiple apks 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    相关资源
    最近更新 更多