我想在 Android Studio 中使用 FFTW 库。首先,我添加了项目的 CMakeLists.txt,我不熟悉 FFTW,我想使用 fftwf(float) 库,但只让 fftw(double) 库工作。然后我发现FFTW默认不编译fftwf。所以我改变了 FFTW 的 CMakelists.txt 其中
option (ENABLE_FLOAT "single-precision" ON)
。但由于magic的原因,整个 FFTW 不会编译成库文件。如果我删除 C++ 代码中对 FFTW 的所有引用并删除 target_link_libraries 并构建,它将成功,但输出目录中甚至没有 fftw3.a。
如何启用编译fftw3f,我更改CMakeLists的方法是否错误?更重要的是,我的 Android Studio 项目出了什么问题?我也用Oboe,每次都编译正常
输出目录有这些文件:
fftw
|-CMakeFiles
| cmake_install.cmake
| config.h
| CTestTestfile.cmake
| fftw3f.pc
| FFTW3fConfig.cmake
| FFTW3fConfigVersion.cmake
| FFTW3LibraryDepends.cmake
我的项目 CMakeLists.txt:
cmake_minimum_required(VERSION 3.22.1)
project("wavestar")
add_library(wavestar SHARED native-lib.cpp audioprocess.cpp)
target_link_libraries(${CMAKE_PROJECT_NAME} android log)
set(OBOE_DIR ../../../libs/oboe-main)
add_subdirectory(${OBOE_DIR} ./oboe)
include_directories(${OBOE_DIR}/include)
target_link_libraries(${CMAKE_PROJECT_NAME} oboe)
set(FFTW_DIR ../../../libs/fftw-3.3.10)
add_subdirectory(${FFTW_DIR} ./fftw)
include_directories(${FFTW_DIR}/api)
target_link_libraries(${CMAKE_PROJECT_NAME} fftw3 fftw3f)
此外,build.gradle.kts:
plugins {
id("com.android.application")
}
android {
namespace = "group.fsw.wavestar"
compileSdk = 34
defaultConfig {
applicationId = "group.fsw.wavestar"
minSdk = 30
targetSdk = 33
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags += "-std=c++20"
}
}
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
externalNativeBuild {
cmake {
path = file("src/main/cpp/CMakeLists.txt")
version = "3.22.1"
}
}
buildFeatures {
viewBinding = true
}
}
dependencies {
implementation("androidx.appcompat:appcompat:1.6.1")
implementation("com.google.android.material:material:1.10.0")
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
}
这不会在我的计算机中使用
ld: error: unable to find library -lfftw3
构建。起初fftw3库是正常的,但现在也无法构建。
我尝试使用纯新的 FFTW 源文件夹和未编辑的 CMakeLists,但它仍然无法构建。
此外,我使用 CLion 打开 FFTW 源文件夹,更改 CMakeLists 中的 option (ENABLE_FLOAT "single-precision" ON)
,然后构建。但我只得到了 fftw3(libfftw3.dll 和 libfftw3.dll.a),但没有得到 fftw3f。
我找到了解决方案。为什么它无法构建任何库的问题没有被调查,因为我的修复成功了。 首先,FFTW 的 CMakeLists.txt 使用以下代码一次只能构建一个精度:
set (PREC_SUFFIX)
if (ENABLE_FLOAT)
set (FFTW_SINGLE TRUE)
set (BENCHFFT_SINGLE TRUE)
set (PREC_SUFFIX f)
endif ()
if (ENABLE_LONG_DOUBLE)
set (FFTW_LDOUBLE TRUE)
set (BENCHFFT_LDOUBLE TRUE)
set (PREC_SUFFIX l)
endif ()
if (ENABLE_QUAD_PRECISION)
set (FFTW_QUAD TRUE)
set (BENCHFFT_QUAD TRUE)
set (PREC_SUFFIX q)
endif ()
set (fftw3_lib fftw3${PREC_SUFFIX})
configure_file (cmake.config.h.in config.h @ONLY)
include_directories (${CMAKE_CURRENT_BINARY_DIR})
if (BUILD_SHARED_LIBS)
add_definitions (-DFFTW_DLL)
endif ()
add_library (${fftw3_lib} ${SOURCEFILES})
只有一个add_library,如果多个选项都为ON,则PREC_SUFFIX将被覆盖。 在此文件的开头 FFTW 使用选项来设置变量,例如 ENABLE_FLOAT。在整个重建/重新加载 CMake 项目/Gradle 同步之前,这些不会产生影响。 我更改了 add_library 以添加多个精度来一次性构建。
add_library (fftw3 ${SOURCEFILES})
add_library (fftw3f ${SOURCEFILES})
add_library (fftw3l ${SOURCEFILES})
并且,也更改了导出命令。
# Original export.
#export (TARGETS ${fftw3_lib} NAMESPACE FFTW3:: FILE ${PROJECT_BINARY_DIR}/FFTW3LibraryDepends.cmake)
export (TARGETS fftw3 fftw3f fftw3l NAMESPACE FFTW3:: APPEND FILE ${PROJECT_BINARY_DIR}/FFTW3LibraryDepends.cmake)