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

问题描述 投票:-1回答:1

我正在尝试使用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):
The file
C:/Users/reyna/Documents/HMC/Clinic/AmazonAppTest/Test2/app/.cxx/cmake/debug/armeabi-v7a/build/FFTW3LibraryDepends.cmake
was generated by the export() command.  It may not be used as the argument
to the include() command.  Use ALIAS targets instead to refer to targets by
alternative names.
Call Stack (most recent call first):
CMakeLists.txt:69 (find_package)
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
BUILD FAILED in 1s
6 actionable tasks: 1 executed, 5 up-to-date

任何人都知道如何解决该错误?我不确定如何处理此问题,因为它似乎来自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文件中包含创建.so库的add_library()命令(对于x86,由于某种原因,它创建了.a库),因此我可以将本机库链接到该目标。我发现这些库已添加到app/build/intermediates/cmake/obj/${abi}文件夹(x86除外,x86由于某种原因将其添加到fftw_build文件夹中)。使用上面的target_link_libraries()命令完成链接。
  4. include_directories()命令使fftw3.h文件对项目可见。但是,除非您运行安装命令,否则fftw3.h文件不会被复制到Android项目中的任何位置。 FFTW3 CMakeList.txt文件具有多个安装命令,这些命令在构建期间不会运行。如果运行构建文件夹中的cmake_install.cmake文件,则将执行这些命令。您可以使用include()命令执行此操作。不知道这是通常做的事情,但是我发现这是可以做到的。我没有运行install命令,因为我发现它不是必需的。

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

构建命令失败。使用参数{--build C:\ Users \ reyna \ Documents \ HMC \ Clinic \ AmazonAppTest执行进程C:\ Users \ reyna \ AppData \ Local \ Android \ Sdk \ cmake \ 3.6.4111459 \ bin \ cmake.exe时出错\ 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查看调用)

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

c++ cmake android-ndk fftw
1个回答
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方法。

© www.soinside.com 2019 - 2024. All rights reserved.