Android NDK Linker(GStreamer) - 无效的链接器名称-fuse-ld = gold

时间:2017-06-20 10:25:37

标签: c++ android-studio android-ndk linker gstreamer

尝试在Windows上使用Android Studio设置GStreamer for Android。我主要是尽可能地遵循他们site的教程,以及this(加上我能找到的任何帮助)。我得到了:

错误:错误:参数'-fuse-ld = gold'

中的链接器名称无效

我的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

和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项目同步运行没有任何问题。但Make Project产生以下内容:

错误:错误:参数'-fuse-ld = gold'

中的链接器名称无效

或者更详细:

* 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

有关如何解决此问题的任何想法?我已经看到一些线程说要添加标志以使其成为gold.exe ...除了没有人说标志设置在哪里(并且线程似乎都没有解决)。

我替换了gstreamer安装指南中指示的'ld.exe'文件,即使它看起来过时了(我在得到相同的错误后也这样做了 - 所以这不会导致它)。

1 个答案:

答案 0 :(得分:3)

clang.exe进程尝试将库链接在一起是一个问题。请注意,无需像问题中的链接中的安装说明那样更改ld.exe文件。

修复:您需要在GStreamer目录中更改每个体系结构的两个文件,以便链接器被调用为gold.exe而不是gold

对于您感兴趣的每个架构,您需要前往(使用arm64作为示例):

1) path\to\Gstreamer\root\arm64\share\gst-android\ndk-build\gstreamer-1.0.mk并将-fuse-ld=gold更改为-fuse-ld=gold.exe(仅在文件中显示一次)。

现在转到:

2) path\to\Gstreamer\root\arm64\include\gmp.h并将-fuse-ld=gold更改为-fuse-ld=gold.exe(再次,只发生一次)。

对我发布的Android.mkgradle文件进行了一些小修改,以便完全编译,但这似乎超出了这个问题的范围(在本地ldlibs中添加了-llog并且只使用了核心插件)。