在macOS Sonoma上构建FlorisBoard开源项目遇编译错误求助
在macOS Sonoma上构建FlorisBoard时遭遇C编译器构建错误
项目信息
开源项目:FlorisBoard
问题描述
在macOS Sonoma系统上尝试构建FlorisBoard时,持续出现构建失败,核心错误为C编译器无法生成可执行文件,导致Ninja构建流程终止。请求其他开发者克隆该项目,验证其在Mac环境下的构建可行性。
错误日志
> Task :app:buildCMakeDebug[arm64-v8a][florisboard-native] C/C++: ninja: Entering directory `/Users/mac/Work/AndroidProjects/fasttype/app/.cxx/Debug/2f3r6z3n/arm64-v8a' C/C++: configure: error: in `/Users/mac/Work/AndroidProjects/fasttype/app/.cxx/Debug/2f3r6z3n/arm64-v8a/nlp/icu4c/.intermediate/host': > Task :app:buildCMakeDebug[arm64-v8a][florisboard-native] FAILED C/C++: configure: error: C compiler cannot create executables C/C++: See `config.log' for more details C/C++: [6/107] Building CXX object utils/CMakeFiles/utils.dir/log.cpp.o C/C++: [7/107] Building CXX object nlp/external/fmt/CMakeFiles/fmt.dir/src/format.cc.o C/C++: ninja: build stopped: subcommand failed. configure: error: C compiler cannot create executables See `config.log' for more details [6/107] Building CXX object utils/CMakeFiles/utils.dir/log.cpp.o [7/107] Building CXX object nlp/external/fmt/CMakeFiles/fmt.dir/src/format.cc.o
错误截图

项目配置文件
CMakeLists.txt
cmake_minimum_required(VERSION 3.22) project(florisboard) set(CMAKE_CXX_STANDARD 20) include_directories(.) ### FlorisBoard ### add_subdirectory(utils) add_subdirectory(nlp) add_library( florisboard-native SHARED dev_patrickgold_florisboard_FlorisApplication.cpp ) target_compile_options(florisboard-native PRIVATE -ffunction-sections -fdata-sections -fexceptions) target_link_libraries( # Destination florisboard-native # Sources android log fl::nlp::core utils )
build.gradle
/* * Copyright (C) 2022 Patrick Goldinger * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // Suppress needed until https://youtrack.jetbrains.com/issue/KTIJ-19369 is fixed @file:Suppress("DSL_SCOPE_VIOLATION") import java.io.ByteArrayOutputStream import java.io.File plugins { alias(libs.plugins.agp.application) alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.serialization) alias(libs.plugins.ksp) alias(libs.plugins.mannodermaus.android.junit5) alias(libs.plugins.mikepenz.aboutlibraries) } android { namespace = "dev.patrickgold.florisboard" compileSdk = 33 buildToolsVersion = "33.0.2" ndkVersion = "25.2.9519653" compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = "1.8" freeCompilerArgs = listOf( "-Xallow-result-return-type", "-opt-in=kotlin.contracts.ExperimentalContracts", "-Xjvm-default=all-compatibility", ) } defaultConfig { applicationId = "dev.patrickgold.florisboard" minSdk = 24 targetSdk = 33 versionCode = 90 versionName = "0.4.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" buildConfigField("String", "BUILD_COMMIT_HASH", "\"${getGitCommitHash()}\"") ksp { arg("room.schemaLocation", "$projectDir/schemas") arg("room.incremental", "true") arg("room.expandProjection", "true") } externalNativeBuild { cmake { targets("florisboard-native") cppFlags("-std=gnu++20", "-stdlib=libc++") arguments( "-DCMAKE_ANDROID_API=" + minSdk.toString(), "-DICU_ASSET_EXPORT_DIR=" + project.file("src/main/assets/icu4c").absolutePath, "-DBUILD_SHARED_LIBS=false", "-DANDROID_STL=c++_static", ) } } ndk { abiFilters += listOf("armeabi-v7a", "arm64-v8a") } sourceSets { maybeCreate("main").apply { assets { srcDirs("src/main/assets") } java { srcDirs("src/main/kotlin") } } } } bundle { language { // We disable language split because FlorisBoard does not use // runtime Google Play Service APIs and thus cannot dynamically // request to download the language resources for a specific locale. enableSplit = false } } buildFeatures { compose = true } composeOptions { kotlinCompilerExtensionVersion = libs.versions.androidx.compose.compiler.get() } externalNativeBuild { cmake { path("src/main/cpp/CMakeLists.txt") } } buildTypes { named("debug") { applicationIdSuffix = ".debug" versionNameSuffix = "-debug-${getGitCommitHash(short = true)}" isDebuggable = true isJniDebuggable = false ndk { // For running FlorisBoard on the emulator // abiFilters += listOf("x86", "x86_64") } resValue("mipmap", "floris_app_icon", "@mipmap/ic_app_icon_debug") resValue("mipmap", "floris_app_icon_round", "@mipmap/ic_app_icon_debug_round") resValue("drawable", "floris_app_icon_foreground", "@drawable/ic_app_icon_debug_foreground") resValue("string", "floris_app_name", "FlorisBoard Debug") } create("beta") { applicationIdSuffix = ".beta" versionNameSuffix = "-alpha04" proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") isMinifyEnabled = true isShrinkResources = true resValue("mipmap", "floris_app_icon", "@mipmap/ic_app_icon_beta") resValue("mipmap", "floris_app_icon_round", "@mipmap/ic_app_icon_beta_round") resValue("drawable", "floris_app_icon_foreground", "@drawable/ic_app_icon_beta_foreground") resValue("string", "floris_app_name", "FlorisBoard Beta") } named("release") { proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") isMinifyEnabled = true isShrinkResources = true resValue("mipmap", "floris_app_icon", "@mipmap/ic_app_icon_stable") resValue("mipmap", "floris_app_icon_round", "@mipmap/ic_app_icon_stable_round") resValue("drawable", "floris_app_icon_foreground", "@drawable/ic_app_icon_stable_foreground") resValue("string", "floris_app_name", "@string/app_name") } create("benchmark") { initWith(getByName("release")) signingConfig = signingConfigs.getByName("debug") matchingFallbacks += listOf("release") ndk { // For running FlorisBoard on the emulator abiFilters += listOf("x86", "x86_64") } } } aboutLibraries { configPath = "app/src/main/config" } testOptions { unitTests { isIncludeAndroidResources = true } unitTests.all { it.useJUnitPlatform() } } } tasks.withType<Test> { useJUnitPlatform() } tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach { kotlinOptions { jvmTarget = JavaVersion.VERSION_1_8.toString() } } dependencies { implementation(libs.accompanist.flowlayout) implementation(libs.accompanist.systemuicontroller) implementation(libs.androidx.activity.compose) implementation(libs.androidx.activity.ktx) implementation(libs.androidx.autofill) implementation(libs.androidx.collection.ktx) implementation(libs.androidx.compose.material) implementation(libs.androidx.compose.runtime.livedata) implementation(libs.androidx.compose.ui) implementation(libs.androidx.compose.ui.tooling.preview) implementation(libs.androidx.core.ktx) implementation(libs.androidx.core.splashscreen) implementation(libs.androidx.emoji2) implementation(libs.androidx.emoji2.views) implementation(libs.androidx.navigation.compose) implementation(libs.androidx.profileinstaller) ksp(libs.androidx.room.compiler) implementation(libs.androidx.room.runtime) implementation(libs.cache4k) implementation(libs.kotlinx.coroutines) implementation(libs.kotlinx.serialization.json) implementation(libs.mikepenz.aboutlibraries.core) implementation(libs.mikepenz.aboutlibraries.compose) implementation(libs.patrickgold.compose.tooltip) implementation(libs.patrickgold.jetpref.datastore.model) implementation(libs.patrickgold.jetpref.datastore.ui) implementation(libs.patrickgold.jetpref.material.ui) testImplementation(libs.equalsverifier) testImplementation(libs.kotest.assertions.core) testImplementation(libs.kotest.extensions.roboelectric) testImplementation(libs.kotest.property) testImplementation(libs.kotest.runner.junit5) androidTestImplementation(libs.androidx.test.ext) androidTestImplementation(libs.androidx.test.espresso.core) } fun getGitCommitHash(short: Boolean = false): String { if (!File(".git").exists()) { return "null" } val stdout = ByteArrayOutputStream() exec { if (short) { commandLine("git", "rev-parse", "--short", "HEAD") } else { commandLine("git", "rev-parse", "HEAD") } standardOutput = stdout } return stdout.toString().trim() }
内容的提问来源于stack exchange,提问作者Muhammad Zahab
相关产品推荐
相关产品推荐

