Android NDK Linker (GStreamer) - invalid linker name -fuse-ld = gold

Trying to configure GStreamer for Android using Android Studio on Windows. I basically follow the tutorial from the site as much as possible, and also watch this (plus everything I can find that helps). I get:

Error: Error: Invalid linker name in argument '-fuse-ld = gold'

My Android.mk:

LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := app LOCAL_SRC_FILES := app-1.c LOCAL_SHARED_LIBRARIES := gstreamer_android LOCAL_LDLIBS := -landroid include $(BUILD_SHARED_LIBRARY) ifndef GSTREAMER_ROOT ifndef GSTREAMER_ROOT_ANDROID $(error GSTREAMER_ROOT_ANDROID is not defined!) endif GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID) endif GSTREAMER_NDK_BUILD_PATH := $(GSTREAMER_ROOT)\share\gst-android\ndk-build GSTREAMER_PLUGINS := coreelements ogg theora vorbis videoconvert audioconvert audioresample playback glimagesink soup opensles G_IO_MODULES := gnutls GSTREAMER_EXTRA_DEPS := gstreamer-video-1.0 include $(GSTREAMER_NDK_BUILD_PATH)\gstreamer-1.0.mk 

and app / build.gradle:

 apply plugin: 'com.android.application' android { compileSdkVersion 25 buildToolsVersion "25.0.2" defaultConfig { applicationId "com.example.quant.icarus" minSdkVersion 23 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" externalNativeBuild { ndkBuild { def gstRoot if (project.hasProperty('gstAndroidRoot')) gstRoot = project.gstAndroidRoot else gstRoot = System.env.GSTREAMER_ROOT_ANDROID if (gstRoot == null) throw new GradleException('GSTREAMER_ROOT_ANDROID must be set, or "gstAndroidRoot" must be defined in your gradle.properties in the top level directory of the unpacked universal GStreamer Android binaries') arguments "NDK_APPLICATION_MK=src/main/jni/Application.mk", "GSTREAMER_JAVA_SRC_DIR=src/main/java", "GSTREAMER_ROOT_ANDROID=$gstRoot", "GSTREAMER_ASSETS_DIR=src/main/assets" targets "app", "gstreamer_android" // All archs except MIPS and MIPS64 are supported abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a' } } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } externalNativeBuild { ndkBuild { path 'src/main/jni/Android.mk' } } } afterEvaluate { compileDebugJavaWithJavac.dependsOn 'externalNativeBuildDebug' compileReleaseJavaWithJavac.dependsOn 'externalNativeBuildRelease' } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.3.1' compile 'com.android.support.constraint:constraint-layout:1.0.2' testCompile 'junit:junit:4.12' } 

Gradle The project is being synchronized without any problems. But the Make Project does the following:

Error: Error: Invalid linker name in argument '-fuse-ld = gold'

Or more verbose:

 * What went wrong: Execution failed for task ':app:externalNativeBuildDebug'. > Build command failed. Error while executing process C:\Users\Quant\AppData\Local\Android\Sdk\ndk-bundle\ndk-build.cmd with arguments {NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=C:\Users\Quant\AndroidStudioProjects\Icarus\app\src\main\jni\Android.mk NDK_APPLICATION_MK=C:\Users\Quant\AndroidStudioProjects\Icarus\app\src\main\jni\Application.mk APP_ABI=arm64-v8a NDK_ALL_ABIS=arm64-v8a NDK_DEBUG=1 APP_PLATFORM=android-23 NDK_OUT=C:/Users/Quant/AndroidStudioProjects/Icarus/app/build/intermediates/ndkBuild/debug/obj NDK_LIBS_OUT=C:\Users\Quant\AndroidStudioProjects\Icarus\app\build\intermediates\ndkBuild\debug\lib NDK_APPLICATION_MK=src/main/jni/Application.mk GSTREAMER_JAVA_SRC_DIR=src/main/java GSTREAMER_ROOT_ANDROID=C:\Users\Quant\Desktop\GStreamer\arm GSTREAMER_ASSETS_DIR=src/main/assets gst-build-arm64-v8a/libgstreamer_android.so} GStreamer : [GEN] => gst-build-arm64-v8a/gstreamer_android.c GStreamer : [COMPILE] => gst-build-arm64-v8a/gstreamer_android.c GStreamer : [LINK] => gst-build-arm64-v8a/libgstreamer_android.so clang.exe: error: invalid linker name in argument '-fuse-ld=gold' make: *** [buildsharedlibrary_arm64-v8a] Error 1 

Any ideas on how to fix this? I saw some streams that say add flags to make it gold.exe ... except that no one says where the flags are set (and the streams don't seem too allowed).

I replaced the file 'ld.exe' as indicated in the gstreamer installation guide, even if it seemed dated (I did it after getting the same error - so as not to cause it).

+1
source share
1 answer

This is a problem with the clang.exe process that is trying to link libraries. Please note: there is no need to modify the ld.exe file, as in the installation instructions, from the link in the question.


Fixed: you need to change two files to one architecture in the GStreamer directory so that the linker gets the name gold.exe , and not gold .

For each architecture you are interested in, you need to go over (using arm64 as an example):

1) path\to\Gstreamer\root\arm64\share\gst-android\ndk-build\gstreamer-1.0.mk and change -fuse-ld=gold to -fuse-ld=gold.exe (it appears only once in file).

Now go to:

2) path\to\Gstreamer\root\arm64\include\gmp.h and change -fuse-ld=gold to -fuse-ld=gold.exe (again, only one occurrence).


Some minor corrections have been made to my published Android.mk and gradle files to fully compile things, but this is beyond the scope of this question (added -llog to local ldlib and uses only the main plugin).

+3
source

Source: https://habr.com/ru/post/1269730/


All Articles