firebase / quickstart-cpp

Firebase Quickstart Samples for C++
https://firebase.google.com/games
Apache License 2.0
206 stars 122 forks source link

firebase admob link error #1

Closed lynx-seu closed 7 years ago

lynx-seu commented 7 years ago

when I add admob by

firebase::admob::Initialize(*app);

I got a linker error

./firebase/admob/client/cpp/src/common.h:42: error: undefined reference to 'firebase::ReferenceCountedFutureImpl::~ReferenceCountedFutureImpl()' firebase/admob/client/cpp/src/banner_view_android.cc:45: error: undefined reference to 'vtable for firebase::ReferenceCountedFutureImpl' /Users/xx/Developer/tools/ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: the vtable symbol may be undefined because the class is missing its key function (see go/missingkeymethod) ./firebase/admob/client/cpp/src/common.h:42: error: undefined reference to 'firebase::ReferenceCountedFutureImpl::~ReferenceCountedFutureImpl()' firebase/admob/client/cpp/src/interstitial_ad_android.cc:41: error: undefined reference to 'vtable for firebase::ReferenceCountedFutureImpl' /Users/xx/Developer/tools/ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: the vtable symbol may be undefined because the class is missing its key function (see go/missingkeymethod) ./firebase/app/client/cpp/src/reference_counted_futureimpl.h:280: error: undefined reference to 'firebase::ReferenceCountedFutureImpl::AllocInternal(int, void, void ()(void))' ./firebase/app/client/cpp/src/reference_counted_future_impl.h:127: error: undefined reference to 'firebase::ReferenceCountedFutureImpl::BackingFromHandle(unsigned int)' ./firebase/app/client/cpp/src/reference_counted_futureimpl.h:132: error: undefined reference to 'firebase::ReferenceCountedFutureImpl::SetBackingError(firebase::FutureBackingData, int, char const_)' ./firebase/app/client/cpp/src/reference_counted_futureimpl.h:135: error: undefined reference to 'firebase::ReferenceCountedFutureImpl::BackingData(firebase::FutureBackingData)' ./firebase/app/client/cpp/src/reference_counted_future_impl.h:138: error: undefined reference to 'firebase::ReferenceCountedFutureImpl::CompleteHandle(unsigned int)' ./firebase/app/client/cpp/src/reference_counted_futureimpl.h:280: error: undefined reference to 'firebase::ReferenceCountedFutureImpl::AllocInternal(int, void, void (_)(void*))' collect2: error: ld returned 1 exit status

stewartmiles commented 7 years ago

It looks like you're not linking with libapp.a as well.

See https://github.com/firebase/quickstart-cpp/blob/master/admob/testapp/jni/Android.mk#L43 .

libapp.a contains all of the code common across each Firebase C++ library so you'll need that.

Also, if you're targeting iOS please make sure you have required pods for each library in your project https://firebase.google.com/docs/cpp/setup#dependencies , similarly for Android https://firebase.google.com/docs/cpp/setup#dependencies_1

Please let us know if this solves your issue.

Cheers, Stewart

On Fri, Aug 12, 2016 at 4:59 PM, Agnesi notifications@github.com wrote:

when I add admob by

firebase::admob::Initialize(*app);

I got a linker error

./firebase/admob/client/cpp/src/common.h:42: error: undefined reference to 'firebase::ReferenceCountedFutureImpl::~ReferenceCountedFutureImpl()' firebase/admob/client/cpp/src/banner_view_android.cc:45: error: undefined reference to 'vtable for firebase::ReferenceCountedFutureImpl' /Users/xx/Developer/tools/ndk/toolchains/arm-linux- androideabi-4.9/prebuilt/darwin-x86_64/bin/../lib/gcc/ arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: the vtable symbol may be undefined because the class is missing its key function (see go/missingkeymethod) ./firebase/admob/client/cpp/src/common.h:42: error: undefined reference to 'firebase::ReferenceCountedFutureImpl::~ReferenceCountedFutureImpl()' firebase/admob/client/cpp/src/interstitial_ad_android.cc:41: error: undefined reference to 'vtable for firebase::ReferenceCountedFutureImpl' /Users/xx/Developer/tools/ndk/toolchains/arm-linux- androideabi-4.9/prebuilt/darwin-x86_64/bin/../lib/gcc/ arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: the vtable symbol may be undefined because the class is missing its key function (see go/missingkeymethod) ./firebase/app/client/cpp/src/reference_counted_futureimpl.h:280: error: undefined reference to 'firebase::ReferenceCountedFutureImpl::AllocInternal(int, void, void (_)(void

_))' ./firebase/app/client/cpp/src/reference_counted_future_impl.h:127: error: undefined reference to 'firebase::ReferenceCountedFutureImpl::BackingFromHandle(unsigned int)' ./firebase/app/client/cpp/src/reference_counted_futureimpl.h:132: error: undefined reference to 'firebase::ReferenceCountedFutureImpl::SetBackingError(firebase::FutureBackingData, int, char const _)' ./firebase/app/client/cpp/src/reference_counted_futureimpl.h:135: error: undefined reference to 'firebase::ReferenceCountedFutureImpl::BackingData(firebase::FutureBackingData )' ./firebase/app/client/cpp/src/reference_counted_future_impl.h:138: error: undefined reference to 'firebase::ReferenceCountedFutureImpl::CompleteHandle(unsigned int)' ./firebase/app/client/cpp/src/reference_counted_futureimpl.h:280: error: undefined reference to 'firebase::ReferenceCountedFutureImpl::AllocInternal(int, void, void (_)(void*))' collect2: error: ld returned 1 exit status

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/firebase/quickstart-cpp/issues/1, or mute the thread https://github.com/notifications/unsubscribe-auth/AFw1ROtjcSkZ4p6VfujnSXH8xxEOl3Bgks5qfQjLgaJpZM4JjjPi .

lynx-seu commented 7 years ago

@stewartmiles There is no error when I create firebase::App without admob.

I put the firebase_cpp_sdk in my source, and create a Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := firebase_app
LOCAL_SRC_FILES := libs/android/$(TARGET_ARCH_ABI)/gnustl/libapp.a    
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := firebase_admob
LOCAL_SRC_FILES := libs/android/$(TARGET_ARCH_ABI)/gnustl/libadmob.a    
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_STATIC_LIBRARY)

and in my app,

LOCAL_CXXFLAGS := -std=c++0x

LOCAL_SHARED_LIBRARIES := libopenal libmpg123 

LOCAL_STATIC_LIBRARIES := libphysfs libvorbis libogg libtheora libmodplug libfreetype libluajit SDL2_static \
                            firebase_app firebase_admob

then in the *.cpp


static int app_ctor(lua_State *L)
{
    printf("app:ctor\n");
    firebase::App **app = 0;
    app = (firebase::App **)lua_newuserdata(L, sizeof(void *));

    firebase::AppOptions ao;
#if defined(__ANDROID__)
    JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv();
    jobject activity = (jobject) SDL_AndroidGetActivity();
    *app = firebase::App::Create(ao, env, activity);
#else
    *app = firebase::App::Create(ao);
#endif

//firebase::admob::Initialize(*app);

    luaL_getmetatable(L, "firebase_app{mt}");
    lua_setmetatable(L, -2);
    return 1;
}

if put firebase::admob::Initialize(*app), I got a lot linker error.

lynx-seu commented 7 years ago

I tried add libanalytics.a to my app, it works fine by firebase::analytics::Initialize(*app);


LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := firebase_app
LOCAL_SRC_FILES := libs/android/$(TARGET_ARCH_ABI)/gnustl/libapp.a    
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := firebase_admob
LOCAL_SRC_FILES := libs/android/$(TARGET_ARCH_ABI)/gnustl/libadmob.a    
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := firebase_analytics
LOCAL_SRC_FILES := libs/android/$(TARGET_ARCH_ABI)/gnustl/libanalytics.a    
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_STATIC_LIBRARY)

so I think it's not linking with libapp.a as well.

In application.mk, I changed toolchain from gcc 4.9 to clang

APP_STL := gnustl_static
APP_ABI := armeabi armeabi-v7a
APP_CPPFLAGS := -frtti  
APP_LDFLAGS := -llog -landroid -lz -latomic
APP_PLATFORM := 10
NDK_TOOLCHAIN_VERSION := clang

Can anyone help me for this

jonsimantov commented 7 years ago

Hi Agnesi,

Does it work if you change the order of linking so admob is first? So it would be:

LOCAL_STATIC_LIBRARIES := libphysfs libvorbis libogg libtheora libmodplug libfreetype libluajit SDL2_static \ * firebase_admob firebase_app*

Jon

On Sat, Aug 13, 2016 at 8:28 PM, Agnesi notifications@github.com wrote:

I tried add libanalytics.a to my app, it works fine by firebase::analytics::Initialize(*app);

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS) LOCAL_MODULE := firebase_app LOCAL_SRC_FILES := libs/android/$(TARGET_ARCH_ABI)/gnustl/libapp.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS) LOCAL_MODULE := firebase_admob LOCAL_SRC_FILES := libs/android/$(TARGET_ARCH_ABI)/gnustl/libadmob.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS) LOCAL_MODULE := firebase_analytics LOCAL_SRC_FILES := libs/android/$(TARGET_ARCH_ABI)/gnustl/libanalytics.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include include $(PREBUILT_STATIC_LIBRARY)

so I think it's not linking with libapp.a as well.

In application.mk, I changed toolchain from gcc 4.9 to clang

APP_STL := gnustl_static APP_ABI := armeabi armeabi-v7a APP_CPPFLAGS := -frtti APP_LDFLAGS := -llog -landroid -lz -latomic APP_PLATFORM := 10 NDK_TOOLCHAIN_VERSION := clang

Can anyone help me for this

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/firebase/quickstart-cpp/issues/1#issuecomment-239653917, or mute the thread https://github.com/notifications/unsubscribe-auth/AH8se7erDcVKqFY-4yILMIlMgkG8gZFvks5qfotKgaJpZM4JjjPi .

lynx-seu commented 7 years ago

Thank you, It works. @jonsimantov

dapeng313 commented 7 years ago

Hi, @jonsimantov. Thanks for your comment. I've fixed same issues. But why lib order is so important?

jonsimantov commented 7 years ago

Here's a really in-depth article about why link order of static libraries matters with many C++ build systems: http://eli.thegreenplace.net/2013/07/09/library-order-in-static-linking

delorenj commented 6 years ago

Thank you for this @jonsimantov ! Saved me from breaking my laptop with a hammer.