【问题标题】:Android.mk: shared library not linkedAndroid.mk:共享库未链接
【发布时间】:2012-07-18 03:12:35
【问题描述】:

我正在尝试将我的库 libtest.so 包含到另一个库中。

libtest.so编译成功,在文件夹中:

$PROJECT/obj/local/armeabi/libtest.so

当我尝试在我的Android.mk 文件中使用它时,我无法使用它的功能。但是,即使我包含了一个不存在的库,我也没有收到错误消息。

这是我的Android.mk 文件:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

#LOCAL_SHARED_LIBRARY := test
LOCAL_SHARED_LIBRARIES := test

LOCAL_MODULE     := mylib
LOCAL_SRC_FILES  := myLib.cpp

include $(BUILD_SHARED_LIBRARY)

当我构建这个时,我刚刚从库中的包含中得到了很多 "No such file or directory" 错误:

jni/myLib.cpp:10:24: error: myinclude.h: No such file or directory

myinclude.h 是库中的一个文件。每个论坛的答案似乎都说LOCAL_SHARED_LIBRARIES := testLOCAL_SHARED_LIBRARIES := libtest 足以使用该库。

我错过了什么?

【问题讨论】:

标签: linker makefile android-ndk


【解决方案1】:

将包含 myinclude.h 的目录添加到 LOCAL_C_INCLUDES:

LOCAL_C_INCLUDES += /dir/to/your/include/files/

【讨论】:

  • 它在同一个目录中,所以不能这样 :( 我期待找到 libtest.so 文件时会出现问题。将 LOCAL_C_INCLUDES 指向 libtest.so 文件也不起作用
  • 你能列出你详细的项目目录结构吗?或者如果可能的话,你可以分享你的项目进行调试吗?
【解决方案2】:

由于库有责任告诉您要包​​含的内容,尽管它可能会暂时解决问题,但使用 LOCAL_C_INCLUDES 指定由其他人编写的包含文件(如 the answer by Gavin 中所建议的那样)在可维护性条款。

其中一个问题是你的问题是libtestAndroid.mk文件没有正确写入。如果它导出任何头文件,你应该添加LOCAL_EXPORT_C_INCLUDES := /path/to/include-dir

这是一个例子(取自$NDK_ROOT/samples/module-exports/jni/Android.mk):

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_SRC_FILES := foo/foo.c
LOCAL_CFLAGS := -DFOO=2
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/foo
LOCAL_EXPORT_CFLAGS := -DFOO=1
LOCAL_EXPORT_LDLIBS := -llog
include $(BUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := bar
LOCAL_SRC_FILES := bar/bar.c
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/bar
LOCAL_STATIC_LIBRARIES := foo
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := zoo
LOCAL_SRC_FILES := zoo/zoo.c
LOCAL_SHARED_LIBRARIES := bar
include $(BUILD_SHARED_LIBRARY)

这里,第一个库是foo。它被构建为一个静态库(参见include $(BUILD_STATIC_LIBRARY))。它导出头目录:

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/foo

第二个库是bar,它是一个共享库(见LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/bar)。当它引用foo 时:

LOCAL_STATIC_LIBRARIES := foo

foo 中的标头将被搜索,就像 -I$LOCAL_PATH/foo 已指定为 gcc。 请注意,它还导出自己的头目录:

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/bar

第三个库是zoo,它是一个共享库。它引用了bar 库。这表明一个共享库可以毫无问题地包含另一个共享库。

如果这不能解决您的问题,请提供更多配置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多