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

时间:2019-10-29 08:03:50

标签: c++ cmake android-ndk fftw

我正在尝试使用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处的CMake错误:13(include):
  文件   C:/用户/雷纳/文档/ HMC /诊所/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文件中包含一个{.1}}命令,可以创建一个.so库(对于x86,由于某种原因,它可以创建一个.a库),因此我可以将我的本机库链接到该目标。我发现这些库已添加到add_library()文件夹中(x86除外,x86由于某种原因将其添加到fftw_build文件夹中)。使用上面的app/build/intermediates/cmake/obj/${abi}命令可以完成链接。

  4. target_link_libraries()命令使include_directories()文件对项目可见。但是,除非您运行安装命令,否则fftw3.h文件不会被复制到Android项目中的任何位置。 FFTW3 CMakeList.txt文件具有多个安装命令,这些命令在构建期间不会运行。如果运行构建文件夹中的fftw3.h文件,则将执行这些命令。您可以使用cmake_install.cmake命令执行此操作。不知道这是通常做的事情,但是我发现这是可以做到的。我没有运行install命令,因为我发现它不是必需的。

问题是,我想要单精度,如果我将FFTW3 CMakeList.txt文件中的include()选项设置为ENABLE_FLOAT,我认为我可以得到单精度。如果这样做,并执行上述步骤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-无规范前缀-fno-addrsig -march = armv7-a -mthumb -Wa,-noexecstack -Wformat -Werror = format-security -O0 -fno-limit-debug-info -Wl,- -exclude-libs,libgcc.a -Wl,-exclude-libsdc,libatomic.a -static-libstdc ++++ -Wl,-build-id -Wl,-warn-shared-textrel -Wl,-致命警告-Wl,-排除libs,libunwind.a -Wl,-无定义-Qunused参数-Wl,-z,noexecstack-共享-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查看调用)

     

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

1 个答案:

答案 0 :(得分:0)

我可以使用单个精度构建,但是它不是一个很好的解决方案,因为我认为如果我执行“ Clean Project”或“ Refresh Linked C ++ Projects”之类的工作,它将不再起作用,因此我必须重复我将在下面描述的过程:

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项目,这很麻烦,所以也许我需要执行build multiple apks方法。