Skip to content

Improper target flag for newer NDKs #1440

@GglLfr

Description

@GglLfr

cc's auto-detection for NDK supplies --target arm-linux-android instead of something like --target armv7a-linux-androideabi35, causing the wrong (and non-existent) sysroot to be used and leading to this error:

ld.lld: error: cannot open crtbegin_dynamic.o: No such file or directory
ld.lld: error: cannot open crtend_android.o: No such file or directory
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Activity

NobodyXu

NobodyXu commented on Mar 20, 2025

@NobodyXu
Collaborator

We use the information extracted from rustc, so I suppose maybe rustc has the wrong information?

GglLfr

GglLfr commented on Mar 20, 2025

@GglLfr
Author

Actually, it might've been caused by these lines. armv7a-linux-androideabi16-clang doesn't exist at all in my installation (that I obtained using sdkmanager --install "ndk;29.0.13113456"). armv7a-linux-androideabi21-clang does exist, however.

GglLfr

GglLfr commented on Mar 20, 2025

@GglLfr
Author

Manually setting CC=aarch64-linux-android35-clang.cmd and CXX=aarch64-linux-android35-clang++.cmd makes the project compile. I'll create a minimum reproducible example soon.

GglLfr

GglLfr commented on Mar 21, 2025

@GglLfr
Author

I've pushed this example, which is just a stripped version of android-activity; the error was different, but caused by wrong sysroots nonetheless:

warning: android-test@0.1.0: Compiler family detection failed due to error: ToolNotFound: failed to find tool "aarch64-linux-android-clang++": program not found (see https://docs.rs/cc/latest/cc/#compile-time-requirements for help)
warning: android-test@0.1.0: In file included from csrc/game-activity/GameActivity.cpp:38:
warning: android-test@0.1.0: In file included from C:/Android/ndk/29.0.13113456/toolchains/llvm/prebuilt/windows-x86_64/bin/../sysroot/usr/include/c++/v1/mutex:191:
warning: android-test@0.1.0: C:/Android/ndk/29.0.13113456/toolchains/llvm/prebuilt/windows-x86_64/bin/../sysroot/usr/include/c++/v1/__condition_variable/condition_variable.h:226:14: error: use of undeclared identifier 'pthread_cond_clockwait'
warning: android-test@0.1.0:   226 |   int __ec = pthread_cond_clockwait(&__cv_, __lk.mutex()->native_handle(), CLOCK_MONOTONIC, &__ts);
warning: android-test@0.1.0:       |              ^
warning: android-test@0.1.0: 1 error generated.
error: failed to run custom build command for `android-test v0.1.0 (C:\Users\glenn\android-test)`

Caused by:
  process didn't exit successfully: `C:\Users\glenn\android-test\target\debug\build\android-test-a8da2f7d96533915\build-script-build` (exit code: 1)
  --- stdout
  cargo::rerun-if-changed=csrc/game-activity/GameActivity.h
  cargo::rerun-if-changed=csrc/game-activity/GameActivity.cpp
  cargo::rerun-if-changed=csrc/game-activity/GameActivityEvents.h
  cargo::rerun-if-changed=csrc/game-activity/GameActivityEvents.cpp
  cargo::rerun-if-changed=csrc/game-activity/GameActivityLog.h
  OUT_DIR = Some(C:\Users\glenn\android-test\target\aarch64-linux-android\debug\build\android-test-d0a1e40c764ebdc4\out)
  OPT_LEVEL = Some(0)
  TARGET = Some(aarch64-linux-android)
  HOST = Some(x86_64-pc-windows-msvc)
  cargo:rerun-if-env-changed=CXX_aarch64-linux-android
  CXX_aarch64-linux-android = None
  cargo:rerun-if-env-changed=CXX_aarch64_linux_android
  CXX_aarch64_linux_android = None
  cargo:rerun-if-env-changed=TARGET_CXX
  TARGET_CXX = None
  cargo:rerun-if-env-changed=CXX
  CXX = None
  cargo:rerun-if-env-changed=CC_ENABLE_DEBUG_OUTPUT
  cargo:warning=Compiler family detection failed due to error: ToolNotFound: failed to find tool "aarch64-linux-android-clang++": program not found (see https://docs.rs/cc/latest/cc/#compile-time-requirements for help)
  RUSTC_WRAPPER = None
  cargo:rerun-if-env-changed=CRATE_CC_NO_DEFAULTS
  CRATE_CC_NO_DEFAULTS = None
  DEBUG = Some(false)
  cargo:rerun-if-env-changed=CXXFLAGS
  CXXFLAGS = None
  cargo:rerun-if-env-changed=TARGET_CXXFLAGS
  TARGET_CXXFLAGS = None
  cargo:rerun-if-env-changed=CXXFLAGS_aarch64_linux_android
  CXXFLAGS_aarch64_linux_android = None
  cargo:rerun-if-env-changed=CXXFLAGS_aarch64-linux-android
  CXXFLAGS_aarch64-linux-android = None
  CARGO_ENCODED_RUSTFLAGS = Some()
  cargo:warning=In file included from csrc/game-activity/GameActivity.cpp:38:
  cargo:warning=In file included from C:/Android/ndk/29.0.13113456/toolchains/llvm/prebuilt/windows-x86_64/bin/../sysroot/usr/include/c++/v1/mutex:191:
  cargo:warning=C:/Android/ndk/29.0.13113456/toolchains/llvm/prebuilt/windows-x86_64/bin/../sysroot/usr/include/c++/v1/__condition_variable/condition_variable.h:226:14: error: use of undeclared identifier 'pthread_cond_clockwait'
  cargo:warning=  226 |   int __ec = pthread_cond_clockwait(&__cv_, __lk.mutex()->native_handle(), CLOCK_MONOTONIC, &__ts);
  cargo:warning=      |              ^
  cargo:warning=1 error generated.

  --- stderr


  error occurred in cc-rs: command did not execute successfully (status code exit code: 1): "clang++.exe" "--target=aarch64-linux-android" "-O0" "-DANDROID" "-ffunction-sections" "-fdata-sections" "-fPIC" "-I" "csrc" "-Wall" "-o" "C:\\Users\\glenn\\android-test\\target\\aarch64-linux-android\\debug\\build\\android-test-d0a1e40c764ebdc4\\out\\4288ea7fee210c9f-GameActivity.o" "-c" "csrc/game-activity/GameActivity.cpp"

I tried running this code separately:

"clang++.exe" "--target=aarch64-linux-android" "-O0" "-DANDROID" "-ffunction-sections" "-fdata-sections" "-fPIC" "-I" "csrc" "-Wall" "-o" "C:\\Users\\glenn\\android-test\\target\\aarch64-linux-android\\debug\\build\\android-test-d0a1e40c764ebdc4\\out\\4288ea7fee210c9f-GameActivity.o" "-c" "csrc/game-activity/GameActivity.cpp"

Which does throw that undefined pthread_cond_clockwait error. I tried running it again, except I changed --target=aarch64-linux-android to --target=aarch64-linux-android35, and it compiles.

This creates another issue though: How exactly do we pass the intended Android API level to cc? Right now it seems to be hardcoded to API level 21 (and 16 for armv7-linux-androideabi).

GglLfr

GglLfr commented on Mar 21, 2025

@GglLfr
Author

Manually setting .flag("--target=aarch64-linux-android35") does make compiling with cargo build --target aarch64-linux-android work, but it seems quite hacky 😓

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    O-androidOperating system: Androidbug

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @madsmtm@NobodyXu@GglLfr

        Issue actions

          Improper `target` flag for newer NDKs · Issue #1440 · rust-lang/cc-rs