4

我有 2 个不同库的源代码,FooMain 和 FooSecondary。FooSecondary 被 FooMain 使用,所以,makefile 必须先编译 FooSecondary,然后编译 FooMain,然后将 FooSecondary 链接到 FooMain。

我的 Android.mk 是:

LOCAL_PATH:= $(调用我的目录)

# Foo 二级库:

# 清除变量
包括 $(CLEAR_VARS)
# 目标构建
LOCAL_ARM_MODE := 手臂   
# 库名称          
LOCAL_MODULE := FooSecondary        
# 将所有 SRC_FILES 设置在一起            
SRC_FILES := $(通配符 $(LOCAL_PATH)/FooSecondary/src/*.c)
SRC_FILES := $(SRC_FILES:$(LOCAL_PATH)/%=%)     
LOCAL_SRC_FILES = $(SRC_FILES)
# 启用日志支持
LOCAL_LDLIBS = -llog    
# C 标志 - 最大优化              
LOCAL_CFLAGS := -O3 -mno-thumb
# C++ 标志 - 最大优化          
LOCAL_CPPFLAGS := -O3 -mno-thumb
# 编译为共享库     
包括 $(BUILD_SHARED_LIBRARY)     

# Foo 二级库:

# 清除变量
包括 $(CLEAR_VARS)
# 包含 OpenCV
包括 3rdparty/OpenCV-2.4.3-rc-android-sdk/sdk/native/jni/OpenCV.mk
# 目标构建
LOCAL_ARM_MODE := 手臂   
# 库名称          
LOCAL_MODULE := FooMain     
# 将所有 SRC_FILES 设置在一起            
SRC_FILES := $(通配符 $(LOCAL_PATH)/FooMain/src/*.cpp)
SRC_FILES := $(SRC_FILES:$(LOCAL_PATH)/%=%)     
LOCAL_SRC_FILES = $(SRC_FILES)
LOCAL_SHARED_LIBRARIES := libFooSecondary
LOCAL_LDLIBS := -L$(LOCAL_PATH)/../libs/armeabi
LOCAL_LDLIBS += -lz -lm -ldl -lGLESv2 -lEGL -llog -lFooSecondary
LOCAL_CFLAGS := -O2 -mno-thumb -Wno-write-strings
LOCAL_CPPFLAGS := -O2 -mno-thumb -Wno-write-strings
# 编译为共享库     
包括 $(BUILD_SHARED_LIBRARY)

我的 Application.mk 是:

APP_CPPFLAGS := -frtti -fexceptions
APP_STL := gnustl_static
APP_ABI := armeabi-v7a

但是,当我使用 ndk-build 编译 Android.mk 时,会出现下一个错误:

Compile arm    : libFooSecondary <= *.c
SharedLibrary  : libFooSecondary.so
Install        : libFooSecondary.so => libs/armeabi-v7a/libFooSecondary.so
SharedLibrary  : libFooMain.so

/home/user/android-ndk-r8/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.4.3/../../../../arm-linux-androideabi/bin/ld: cannot find -lFooSecondary

collect2: ld returned 1 exit status
make: *** [obj/local/armeabi-v7a/libFooMain.so] Error 1

如果正确编译和安装,为什么找不到 libFooSecondary.so?

另外,如果 LOCAL_MODULE 名称更改,例如,第一个是 LOCAL_MODULE := zname 而第二个是 LOCAL_MODULE := aname,则首先编译第二个,我不知道为什么。

4

2 回答 2

5

Android.mk长得怪怪的。它在LOCAL_PATH某处分配吗?无需分配LOCAL_CPPFLAGS给 duplicate LOCAL_CFLAGS,因为 ndk-build 将两组标志都放在 C++ 命令行上。

要更好地了解 NDK 如何解释您的Application.mkAndroid.mk,您可以运行

ndk-build V=1

这将回显所有执行的命令,包括编译和链接,以及 NDK 构建分配的所有参数。

于 2012-10-29T21:57:38.367 回答
2

尝试将 FooSecondary 编译为静态库并将其包含在 FooMain 中:LOCAL_STATIC_LIBRARIES := libFooSecondary

ndk 不能很好地与多个共享库一起使用,除非它们被 dlopen'd。

于 2012-10-30T07:53:33.807 回答