Непонятная ошибка связывания с GCC, но не с VC ++ - PullRequest
0 голосов
/ 12 февраля 2012

Я делаю библиотеку, которую хочу использовать как в Android, так и в Windows. Для окон, используя Visual Studio 2010, он компилируется, связывается и работает нормально.

Для Android я использую скрипт ndk-build с android-ndk-r7 (который использует 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 ++.

РЕДАКТИРОВАТЬ2 :

Обновлен журнал ошибок. Помогает ли это что-нибудь?

Когда я использую «nm RenderManagerImpl.o», я получаю символы «V» и адреса «00000000» для «_ZTI4IRenderManager», например.

EDIT3 : Кажется, если я превращаю jonsenginetests в общую библиотеку, а не в статическую, она компилируется. Что это значит?

Спасибо

1 Ответ

0 голосов
/ 12 февраля 2012

Это немного догадка, но это имя класса звучит так, как будто оно связано с RTTI, который по умолчанию отключен в Android NDK.

Если я прав, вы можете включить RTTIдля вашего приложения, добавив следующее в ваш Android.mk файл:

LOCAL_CPP_FEATURES := rtti

Для получения дополнительной информации, я бы порекомендовал посмотреть в docs\ANDROID-MK.html и docs\CPLUSPLUS-SUPPORT.html в Android NDK

Также может быть, что вы используете часть стандартной библиотеки, которая не поддерживается Android NDK.Поддержка по умолчанию довольно ограничена.Вы можете изменить то, что он использует, указав APP_STL в Application.mk.Например:

APP_STL := gnustl_static
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...