GCC出现模糊链接错误,但VC++没有



我正在制作一个库,我的目标是在android和windows中使用。对于windows,使用Visual Studio 2010,它可以很好地编译、链接和运行。

对于Android,我使用带有Android-ndk-r7的ndk构建脚本(它使用gcc 4.4.3)。我收到了几个链接器错误:

./obj/local/armeabi-v7a/libjonsengine.a(RenderManagerImpl.o):(.data.rel.ro._ZTI1
4IRenderManager[typeinfo for IRenderManager]+0x0): undefined reference to `vtabl
e for __cxxabiv1::__si_class_type_info'
./obj/local/armeabi-v7a/libjonsengine.a(RenderManagerImpl.o):(.data.rel.ro._ZTI1
2IBaseManager[typeinfo for IBaseManager]+0x0): undefined reference to `vtable fo
r __cxxabiv1::__class_type_info'
./obj/local/armeabi-v7a/libjonsengine.a(RenderManagerImpl.o):(.data.rel.ro+0x34)
: undefined reference to `vtable for __cxxabiv1::__si_class_type_info'
./obj/local/armeabi-v7a/libjonsengine.a(LogManagerImpl.o):(.data.rel.ro._ZTI11IL
ogManager[typeinfo for ILogManager]+0x0): undefined reference to `vtable for __c
xxabiv1::__si_class_type_info'
./obj/local/armeabi-v7a/libjonsengine.a(LogManagerImpl.o):(.data.rel.ro+0x38): u
ndefined reference to `vtable for __cxxabiv1::__si_class_type_info'
./obj/local/armeabi-v7a/libjonsengine.a(MemoryManagerImpl.o):(.data.rel.ro._ZTI1
4IMemoryManager[typeinfo for IMemoryManager]+0x0): undefined reference to `vtabl
e for __cxxabiv1::__si_class_type_info'
./obj/local/armeabi-v7a/libjonsengine.a(MemoryManagerImpl.o):(.data.rel.ro+0x40)
: undefined reference to `vtable for __cxxabiv1::__si_class_type_info'
collect2: ld returned 1 exit status
make: *** [obj/local/armeabi-v7a/libandroidgame.so] Error 1

这是我的Android.mk:

LOCAL_PATH:= $(call my-dir)
TOP_PATH := $(LOCAL_PATH)
include $(CLEAR_VARS)
# Main engine
LOCAL_MODULE    := jonsengine
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../include/ 
                    $(LOCAL_PATH)/../include/Core/ 
                    $(LOCAL_PATH)/../interface/ 
                    $(LOCAL_PATH)/../include/Render/ 
                    $(LOCAL_PATH)/../include/Utils/ 
                    $(LOCAL_PATH)/../include/Memory/
# Core
LOCAL_SRC_FILES :=  ../src/Core/Engine.cpp
# Rendering
LOCAL_SRC_FILES +=  ../src/Render/RenderManagerImpl.cpp
# Utils
LOCAL_SRC_FILES +=  ../src/Utils/LogManagerImpl.cpp 
                    ../src/Utils/PortableTime.cpp
# Memory
LOCAL_SRC_FILES +=  ../src/Memory/MemoryManagerImpl.cpp 
                    ../src/Memory/MemoryPool.cpp 
                    ../src/Memory/dlmalloc.c
LOCAL_CFLAGS := -DSTRUCT_MALLINFO_DECLARED
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)
LOCAL_EXPORT_CFLAGS := $(LOCAL_CFLAGS)
LOCAL_LDLIBS    := -lGLESv2 -llog
include $(BUILD_STATIC_LIBRARY)

# Testing library
include $(CLEAR_VARS)
LOCAL_MODULE    := jonsenginetests
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../Tests/ 
                    $(LOCAL_PATH)/../Tests/Memory/ 
                    $(LOCAL_PATH)/../Tests/Core/
LOCAL_SRC_FILES :=  ../Tests/TestManager.cpp 
                    ../Tests/Memory/MemoryManagerTest.cpp 
                    ../Tests/TestClass1.cpp
LOCAL_CFLAGS :=
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)
LOCAL_EXPORT_CFLAGS := $(LOCAL_CFLAGS)
LOCAL_STATIC_LIBRARIES := jonsengine
LOCAL_LDLIBS    :=-llog
include $(BUILD_STATIC_LIBRARY)

我猜不出那个错误的含义和原因。有人能对此有所了解吗?正如我所提到的,它可以很好地与VC++配合使用。

EDIT2

已更新错误日志。这有什么帮助吗?

例如,当我使用"nm RenderManagerImpl.o"时,我会得到'_ZTI4RenderManager'的'V'符号和"00000000"地址。

编辑3:似乎如果我把jonenginetests制作成一个共享库,而不是静态库,它就会编译。这意味着什么?

感谢

这有点猜测,但类名听起来可能与RTTI有关,RTTI在android NDK中默认禁用。

假设我是对的,您可以通过在Android.mk文件中添加以下内容来为您的应用程序启用RTTI:

LOCAL_CPP_FEATURES := rtti

有关更多信息,我建议在android NDK 中查找docsANDROID-MK.htmldocsCPLUSPLUS-SUPPORT.html

也可能是你使用的是标准库中安卓NDK不支持的一部分。它的默认支持相当有限。您可以通过在Application.mk中提供APP_STL来更改它的用途。例如:

APP_STL := gnustl_static

相关内容

  • 没有找到相关文章

最新更新