使用NDK编译非本地文件,链接器错误

时间:2013-11-17 15:25:52

标签: android c++ c android-ndk linker-errors

有关NDK链接器错误的许多相关问题,但我无法清楚地找到解决方案。 我正在尝试扩展一个示例NDK应用程序,通过添加另外4个我自己的本地文件。 我将它们包含在Android.mk文件中,并适当地包含.h文件。 这是我的Android.mk文件。

include $(BUILD_SHARED_LIBRARY)

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := libgl2jni
LOCAL_CFLAGS    := -Werror
LOCAL_SRC_FILES := gl_code.cpp \
                  sglBandwidthBench.c \
                  sglBandwidth.c \
                  common.c \
                  timer.c

LOCAL_LDLIBS    := -llog -lGLESv3 -lEGL

include $(BUILD_SHARED_LIBRARY)

并且.h文件包含正确。但是编译给了我对函数x的未定义引用。 我添加了文件sglBandwidthBench.c sglBandwidth.c common.c timer.c,它们都不包含main函数,唯一的链接是通过引用gl_code.cpp中的其中一个函数。

如何成功将这些文件链接在一起?我想不出任何指定它的方法。任何帮助将非常感激。

1 个答案:

答案 0 :(得分:0)

您可能知道,未定义引用上的链接错误是由于您提供的预编译库中的构建系统找不到一个或多个方法的实现。所以,最重要的是,您可能错过了包含函数x的实现的共享库。

我的建议是仔细检查您的任何libGLESv3.so目录下是否确实有<ndk>\platforms\<android-api-level>\arch-arm\usr\lib。或者,选中<ndk>\docs\STABLE-APIS.html以查看所有您所使用的库是否列在那里。如果其中一个不是,您将需要升级NDK版本或手动将缺少的库添加到源代码中(为此,请阅读<ndk>\docs\ANDROID-MK.html中的PREBUILT_SHARED_LIBRARY部分。)

希望这有帮助!

编辑:您好,我刚刚从您的评论中了解到,您正试图在.c文件中调用.cpp文件中实现的方法。因此,您需要使用以下代码包含gl_code.cpp的内容:

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __cplusplus
}
#endif