这是我的完整Android.mk文件,当我试图构建这个文件时,我会遇到一个链接器问题(请参阅下面)
LOCAL_PATH := $(call my-dir)
#
# Opus - low-latency audio codec
#
include $(CLEAR_VARS)
LOCAL_DIR := opus-1.0.3
LOCAL_MODULE := opus
LOCAL_CELT_SOURCES := \
$(LOCAL_DIR)/celt/bands.c \
...
LOCAL_SILK_SOURCES := \
$(LOCAL_DIR)/silk/CNG.c \
...
LOCAL_SILK_SOURCES_FIXED := \
$(LOCAL_DIR)/silk/fixed/LTP_analysis_filter_FIX.c \
...
LOCAL_SILK_SOURCES_FLOAT := \
$(LOCAL_DIR)/silk/float/apply_sine_window_FLP.c \
...
LOCAL_OPUS_SOURCES := \
$(LOCAL_DIR)/src/opus.c \
...
LOCAL_CFLAGS := -DNONTHREADSAFE_PSEUDOSTACK
LOCAL_C_INCLUDES := \
$(LOCAL_DIR)/include \
$(LOCAL_DIR)/celt \
$(LOCAL_DIR)/silk \
$(LOCAL_DIR)/silk/fixed \
$(LOCAL_DIR)/silk/float
LOCAL_SRC_FILES := $(LOCAL_CELT_SOURCES) \
$(LOCAL_SILK_SOURCES) \
$(LOCAL_SILK_SOURCES_FIXED) \
$(LOCAL_SILK_SOURCES_FLOAT)
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_DIR)/include
include $(BUILD_STATIC_LIBRARY)
################
include $(CLEAR_VARS)
LOCAL_MODULE := audio-client-jni
LOCAL_SRC_FILES := audio-client-jni.cpp
# low latency codec
LOCAL_STATIC_LIBRARIES += opus
# for native audio
LOCAL_LDLIBS += -lOpenSLES
# for logging
LOCAL_LDLIBS += -llog
# for native asset manager
LOCAL_LDLIBS += -landroid
include $(BUILD_SHARED_LIBRARY)为了排除opus的构建方式存在问题,我使用了一个不同的构建系统(称为冻土带)来完成完全相同的工作,并且它在使用MSVC++的Windows上非常复杂。
下面是链接器命令和错误(为了提高可读性,我格式化了命令行)
C:/Projects/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/bin/arm-linux-androideabi-g++
-Wl,-soname,libaudio-client-jni.so
-shared
--sysroot=C:/Projects/android-ndk-r8e/platforms/android-14/arch-arm
C:/Projects/workspace/AudioClient//obj/local/armeabi/objs/audio-client-jni/audio-client-jni.o
C:/Projects/workspace/AudioClient//obj/local/armeabi/libopus.a
C:/Projects/workspace/AudioClient//obj/local/armeabi/libstdc++.a
-lgcc
-no-canonical-prefixes
-Wl,--no-undefined
-Wl,-z,noexecstack
-Wl,-z,relro
-Wl,-z,now
-LC:/Projects/android-ndk-r8e/platforms/android-14/arch-arm/usr/lib
-lOpenSLES
-llog
-landroid
-lstdc++
-lc
-lm
-o C:/Projects/workspace/AudioClient//obj/local/armeabi/libaudio-client-jni.so错误跟随
C:/Projects/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: C:/Projects/workspace/AudioClient//obj/local/armeabi/objs/audio-client-jni/audio-client-jni.o: in function (anonymous namespace)::AuClient::ReceiveThenEnqueue():C:/Projects/workspace/AudioClient//jni/audio-client-jni.cpp:419: error: undefined reference to 'opus_decode'
C:/Projects/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: C:/Projects/workspace/AudioClient//obj/local/armeabi/objs/audio-client-jni/audio-client-jni.o: in function InitializeThread:C:/Projects/workspace/AudioClient//jni/audio-client-jni.cpp:387: error: undefined reference to 'opus_decoder_create'我需要第二双眼睛来观察这个问题,它明确地在audio-client-jni.o之前链接libopus.a,但如果这是我不知道如何修改makefile以获得所需结果的问题。当包含在C++应用程序中时,opus.hAPI是用extern "C“定义的。到目前为止还没有运气。
发布于 2013-07-31 09:10:22
感谢@AlexCohn的协助,显然没有任何问题,相反,所有的源文件都没有适当地包括,轻微忽视了我的部分。
在我的例子中,我不确定应该如何设置东西才能运行bin util命令,幸运的是,它非常简单:
"C:\Projects\android-ndk-r8e\toolchains\arm-linux-androideabi-4.6\prebuilt\windows-x86_64\bin\arm-linux-androideabi-nm.exe" "C:\Projects\workspace\AudioClient\obj\local\armeabi\libopus.a"我只是从预先构建的工具链中挑选了一些看似合理的东西。
有了nm的输出,我可以验证出口是否在那里。经过仔细检查后,我发现我忘了把$(LOCAL_OPUS_SOURCES)包括在我的LOCAL_C_INCLUDES中。解决这个问题。
https://stackoverflow.com/questions/17946318
复制相似问题