我正在创建一个我想要在android和windows中使用的库。 对于Windows,使用Visual Studio 2010,它可以编译,链接和运行。
对于Android,我使用的是带有android-ndk-r7的ndk-build脚本(使用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”时,我得到“V”符号和“_Z00004IRenderManager”的“00000000”地址。
EDIT3 : 似乎我将jonsenginetests变成共享库而不是静态编译。这意味着什么?
由于
答案 0 :(得分:0)
这是一个猜测,但该类名称听起来可能与RTTI有关,默认情况下在Android NDK中禁用。
假设我是对的,您可以通过在Android.mk
文件中添加以下内容为您的应用启用RTTI:
LOCAL_CPP_FEATURES := rtti
有关详细信息,我建议您查看android NDK中的docs\ANDROID-MK.html
和docs\CPLUSPLUS-SUPPORT.html
也可能是你正在使用android NDK不支持的标准库的一部分。它的默认支持相当有限。您可以在APP_STL
中提供Application.mk
来更改其使用的内容。例如:
APP_STL := gnustl_static