无法链接到 Android NDK 的 FFTW 库

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

我想在我的 Android NDK 项目中使用 FFTW3。因此,我在 MacO 上为 Android 构建了库,如下所示:

./configure --host=aarch64-none-linux-android33 --enable-threads --enable-float
sudo make 
sudo make install

然后我将其链接到

build.gradle

externalNativeBuild {
        cmake {
           cppFlags "-L/path/to/fftwf/.libs/ -lfftw3f_threads -lfftw3f -lm",
                    "-L/path/to/fftwf/threads/.libs/ ",
                    "-O3 -g --std=c++17 -fopenmp"
        }
}

然后我将FFTW纳入到

CMakeLists.txt
的CMake流程中:

add_library( demo SHARED native-lib.cpp )
# ....
add_subdirectory(fftwf)
include_directories(fftwf/api)

target_include_directories( fbi PRIVATE ${CMAKE_SOURCE_DIR}/fftwf/api )
target_include_directories( fbi PRIVATE ${CMAKE_SOURCE_DIR}/fftwf/threads/.libs )
target_link_libraries( demo fftw3 )   

将 FFTW 与

#include "fftwf/api/fftw3.h"
一起包含后,出现以下链接错误:

ld: error: undefined symbol: fftwf_threads_set_callback
>>> referenced by fftw-bench.c:101   (/path/to/fftwf_3.3.10/tests/fftw-bench.c:101)
>>>               fftwf_3.3.10/CMakeFiles/bench.dir/tests/fftw-bench.c.o:(useropt)

我在 FFTW3.3.10 文档中找不到任何指定使用线程时如何正确链接库的内容。由于

fftwf_threads_set_callback
是第一次调用 FFTW 线程库,我认为构建过程中出现了问题,但与文档进行比较时我找不到任何缺陷。

android android-studio linker fftw
1个回答
0
投票

我可以通过使用 CMake 构建 FFTW 来解决这个问题:

add_subdirectory(fftw)

add_library( demo SHARED native-lib.cpp )

target_include_directories( demo PRIVATE ${CMAKE_SOURCE_DIR}/fftwf/api )
target_include_directories( demo PRIVATE ${CMAKE_SOURCE_DIR}/fftwf/threads )

target_link_libraries( demo fftw3f fftw3f_threads )

不知何故,fftw/CMakeLists.txt 没有启用单精度和线程,就像我在

./configure
标志中指定的那样,所以我手动启用它:

option (ENABLE_THREADS "Use pthread for multithreading" ON)
option (ENABLE_FLOAT "single-precision" ON)

我最初也使用了

--enable-neon
标志,但这也会产生 ld 错误,并且我找不到手动调整 CMakeLists 的方法,所以我必须设置
#define HAVE_NEON 0

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