CMake 不将 FFTW 构建为子目录

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

我想在 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。

android c++ android-studio cmake fftw
1个回答
0
投票

我找到了解决方案。为什么它无法构建任何库的问题没有被调查,因为我的修复成功了。 首先,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)
© www.soinside.com 2019 - 2024. All rights reserved.