【发布时间】: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 的了解,我认为会发生以下情况:
第一个
set()命令只是将CMAKE_INSTALL_PREFIX变量设置为我选择的位置。我现在不使用它,但以后可能会有用。更多内容请见下文...第二个
set()命令设置一个变量为我电脑中FFTW的安装位置。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()命令完成的。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: 错误:找不到-lfftw3fclang++:错误:链接器命令失败,退出代码为 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