I'm trying to build analytics support into a Qt (Android and iOS) application using the Firebase C++ libraries (2.0.0 / 2.1.0). When my app is being linked I get the following errors:
blaze-out/arm-linux-androideabi-4.8-bionic-armv7a-opt/genfiles/firebase/app/client/cpp/include/firebase/variant.h:533: error: undefined reference to 'firebase::Variant::assert_is_type(firebase::Variant::Type) const'
blaze-out/arm-linux-androideabi-4.8-bionic-armv7a-opt/genfiles/firebase/app/client/cpp/include/firebase/variant.h:543: error: undefined reference to 'firebase::Variant::assert_is_type(firebase::Variant::Type) const'
blaze-out/arm-linux-androideabi-4.8-bionic-armv7a-opt/genfiles/firebase/app/client/cpp/include/firebase/variant.h:553: error: undefined reference to 'firebase::Variant::assert_is_type(firebase::Variant::Type) const'
blaze-out/arm-linux-androideabi-4.8-bionic-armv7a-opt/genfiles/firebase/app/client/cpp/include/firebase/variant.h:567: error: undefined reference to 'firebase::Variant::assert_is_string() const'
firebase/analytics/client/cpp/src/analytics_android.cc:228: error: undefined reference to 'firebase::Variant::TypeName(firebase::Variant::Type)'
collect2: error: ld returned 1 exit status
What am I missing?
I'm including the following headers (following the examples from GitHub)
#include "firebase/analytics.h"
#include "firebase/analytics/event_names.h"
#include "firebase/analytics/parameter_names.h"
#include "firebase/analytics/user_property_names.h"
And linking against libapp.a and libanalytics.a in my pri file:
LIBS += -L$$FIREBASE_SDK_LIBS_PATH -lapp
LIBS += -L$$FIREBASE_SDK_LIBS_PATH -lanalytics
I have the AdMob example working in a similar setup - but I can't get the analytics to build...
Turns out the order of linking is important.
Link libanalytics.a before libapp.a and it works
LIBS += -L$$FIREBASE_SDK_LIBS_PATH -lanalytics
LIBS += -L$$FIREBASE_SDK_LIBS_PATH -lapp
(I was linking app first)
Related
there is a source code which is built fine (using cmake) for my host platform but when i target android(using android studio cmake) on the same platfrom it gives me the following errors:
Error:error: cannot find -l[/root/libuv-1.x/out/cmake/libuv.a]
Error:error: cannot find -lpthread
Error:(49) undefined reference to 'uv_default_loop'
Error:(84) undefined reference to 'uv_fs_open'
Error:(49) undefined reference to 'uv_now'
...
any reference to properties defined in uv headers creates a undefined reference to x error.
this is how i include uv in the project cmake:
set(UV_INCLUDE_DIR "[/root/libuv-1.x/include/]")
set(UV_LIBRARY "[/root/libuv-1.x/out/cmake/libuv.a]")
find_package(UV REQUIRED)
include_directories("/root/libuv-1.x/include/")
include_directories(${UV_INCLUDE_DIR})
and this is how i compile and link the source code in cmake:
add_library(proto-lib SHARED ${HEADERS} ${SOURCES} ${HTTPD_SOURCES})
target_link_libraries(proto-lib ${UV_LIBRARIES} ${EXTRA_LIBS})
the libuv doesn't seem to be included at all.
how can i fix this?
CAMERA NDK
I add .h(#include <media/NdkImageReader.h>) to .cpp.
when compile project, the function from .h (#include <media/NdkImageReader.h>)undefined reference.
#include <media/NdkImageReader.h>
#include <media/NdkImage.h>
error:
CMakeFiles/native-camera2-lib.dir/native-camera2-lib.cpp.o: In function Java_com_example_ts_camerandk_NativeCamera_openCamera':
D:\AndroidStudioProjects\camerandk\app\src\main\jni\native-camera2-lib.cpp:(.text+0x348): undefined reference to AImageReader_new'
D:\AndroidStudioProjects\camerandk\app\src\main\jni\native-camera2-lib.cpp:(.text+0x378): undefined reference to AImageReader_setImageListener
CMakeFiles/native-camera2-lib.dir/native-camera2-lib.cpp.o: In function Java_com_example_ts_camerandk_NativeCamera_startPreview':
D:\AndroidStudioProjects\camerandk\app\src\main\jni\native-camera2-lib.cpp:(.text+0x6e4): undefined reference to AImageReader_getWindow
clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)
enter code here
Check your cmake target libraries line in CMakeLists.txt file. You are forgetting to include mediandk
target_link_libraries(... camera2ndk mediandk ...)
Media NDK is a different library, and is not a part of Camera or Camera2.
I have troubles to run the GStreamer tutorials. I followed all tutorial steps, and run into an error.
My System:
android-ndk-r11c, gstreamer-sdk-android-arm-debug-2013.6
My System: Windows 10 - 64 bit
The Error:
C:\gstreamer-sdk-android-arm-debug-2013.6\share\gst-sdk\tutorials\android-tutorial-1>ndk-build
GStreamer : [GEN] => gst-build/gstreamer_android.c
GStreamer : [COMPILE] => gst-build/gstreamer_android.c
GStreamer : [LINK] => gst-build/libgstreamer_android.so
lex.priv_gst_parse_yy.c:1598: error: undefined reference to '__srget'
gutils.c:2406: error: undefined reference to 'issetugid'
localcharset.c:158: error: undefined reference to '__srget'
localcharset.c:167: error: undefined reference to '__srget'
./localcharset.c:195: error: undefined reference to '__srget'
/home/slomo/Projects/android/android-ndk-r8e/toolchains/arm-linux-androideabi-4.7/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.7/include-fixed/stdio.h:376: error: undefined reference to '__swbuf'
collect2.exe: error: ld returned 1 exit status
make: *** [buildsharedlibrary] Error 1
C:\gstreamer-sdk-android-arm-debug-2013.6\share\gst-sdk\tutorials\android-tutorial-1>
I tried:
Windows linkage problems : Due to problems related to the standard linker, Google’s Gold Linker is used to build GStreamer applications. Unfortunately, the Android NDK toolchain for Windows does not include the gold linker and the standard one has to be used.
If you observe linkage problems, you can replace the linker in your Android NDK with the gold one from this project. Download the android-ndk-r8b-ma-windows.7z file, extract \android-ndk-r8b\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\arm-linux-androideabi\bin\ld.exe (only this file is needed) and overwrite the one in the same folder in your Android NDK installation.
No effect. Any ideas how to solve this?
I had similar problem before please give a try with ndk10b.It is always good to check in header files for __srget before move forward.
There have been some questions similar to mine, but it seems that their solutions don't work for me.
I'm trying to compile dumpsys source code using Android NDK. I have added a couple of lines to Android.mk to include the libraries.
The final Android.mk file looks like this:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
dumpsys.cpp
LOCAL_SHARED_LIBRARIES := \
libutils \
liblog \
libbinders
ANDROID_SRC="my android source directory"
LOCAL_C_INCLUDES := ${ANDROID_SRC}/frameworks/native/include \
${ANDROID_SRC}/system/core/include
#$(warning $(TARGET_C_INCLUDES))
LOCAL_MODULE:= dumpsys
TARGET_ARCH := arm
TARGET_ARCH_ABI := armeabi-v7a
include $(BUILD_EXECUTABLE)
when I execute ndk-build, I get the following errors:
/home/mahdi/university/androidsource/system/core/include/utils/TypeHelpers.h:144: error: undefined reference to 'android::String16::~String16()'
/home/mahdi/university/androidsource/system/core/include/utils/Vector.h:240: error: undefined reference to 'android::VectorImpl::finish_vector()'
/home/mahdi/university/androidsource/system/core/include/utils/Vector.h:241: error: undefined reference to 'android::VectorImpl::~VectorImpl()'
/home/mahdi/university/androidsource/system/core/include/utils/TypeHelpers.h:135: error: undefined reference to 'android::String16::String16()'
/home/mahdi/university/androidsource/system/core/include/utils/TypeHelpers.h:154: error: undefined reference to 'android::String16::String16(android::String16 const&)'
/home/mahdi/university/androidsource/system/core/include/utils/TypeHelpers.h:166: error: undefined reference to 'android::String16::String16(android::String16 const&)'
/home/mahdi/university/androidsource/system/core/include/utils/String16.h:178: error: undefined reference to 'strzcmp16'
/home/mahdi/university/androidsource/system/core/include/utils/StrongPointer.h:143: error: undefined reference to 'android::RefBase::decStrong(void const*) const'
jni/dumpsys.cpp:32: error: undefined reference to 'android::defaultServiceManager()'
jni/dumpsys.cpp:35: error: undefined reference to '__android_log_print'
/home/mahdi/university/androidsource/system/core/include/utils/Vector.h:224: error: undefined reference to 'android::VectorImpl::VectorImpl(unsigned int, unsigned int)'
/home/mahdi/university/androidsource/system/core/include/utils/Vector.h:224: error: undefined reference to 'android::VectorImpl::VectorImpl(unsigned int, unsigned int)'
/home/mahdi/university/androidsource/system/core/include/utils/Vector.h:245: error: undefined reference to 'android::VectorImpl::operator=(android::VectorImpl const&)'
/home/mahdi/university/androidsource/system/core/include/utils/Vector.h:378: error: undefined reference to 'android::VectorImpl::sort(int (*)(void const*, void const*))'
jni/dumpsys.cpp:49: error: undefined reference to 'android::String16::String16(char const*)'
/home/mahdi/university/androidsource/system/core/include/utils/Vector.h:338: error: undefined reference to 'android::VectorImpl::add(void const*)'
jni/dumpsys.cpp:49: error: undefined reference to 'android::String16::~String16()'
jni/dumpsys.cpp:51: error: undefined reference to 'android::String16::String16(char const*)'
/home/mahdi/university/androidsource/system/core/include/utils/Vector.h:338: error: undefined reference to 'android::VectorImpl::add(void const*)'
jni/dumpsys.cpp:51: error: undefined reference to 'android::String16::~String16()'
jni/dumpsys.cpp:53: error: undefined reference to 'android::String16::String16(char const*)'
/home/mahdi/university/androidsource/system/core/include/utils/Vector.h:338: error: undefined reference to 'android::VectorImpl::add(void const*)'
jni/dumpsys.cpp:53: error: undefined reference to 'android::String16::~String16()'
jni/dumpsys.cpp:66: error: undefined reference to 'android::operator<<(android::TextOutput&, android::String16 const&)'
jni/dumpsys.cpp:81: error: undefined reference to 'android::operator<<(android::TextOutput&, android::String16 const&)'
jni/dumpsys.cpp:89: error: undefined reference to 'android::operator<<(android::TextOutput&, android::String16 const&)'
/home/mahdi/university/androidsource/system/core/include/utils/StrongPointer.h:143: error: undefined reference to 'android::RefBase::decStrong(void const*) const'
jni/dumpsys.cpp:94: error: undefined reference to 'android::aerr'
jni/dumpsys.cpp:94: error: undefined reference to 'android::aout'
collect2: error: ld returned 1 exit status
How should I solve this issue?
Thanks in advance.
I'm working on a similar issue here.
Basically, dumpsys is an AOSP component and intended to be built with the AOSP toolchain. You will need to apply some tweaks to port it to NDK – including stuff from ${ANDROID_SRC} is the first step but not the whole story.
You've successfully included the headers and thus made the compiler happy. Now the linker is complaining because it cannot find the libraries you are linking against. The good news is that they are shared libraries, thus having the libraries around at build time isn't a strict requirement.
The NDK defines a stable API of libraries you can use, which is documented here. liblog is in that list and can be included by adding the following lines to Android.mk:
LOCAL_LDLIBS := \
-llog \
The other two libraries are not part of the stable API. This essentially means that even if your code works on a particular version of Android, it may break on any later version because the API may have changed – you might want to bear this in mind.
Since these libraries are shared, all ld does is check if they actually provide the functions you're using. This question and its accepted answer have instructions for getting rid of the related error messages:
One way is to use something like:
LOCAL_LDFLAGS := -Wl,--unresolved-symbols=ignore-all
However, this will bypass all checks – so if you try to use a function that is indeed absent from the library, ld has no chance of warning you.
The cleaner, but more work-intensive approach, is to provide stub libraries. A stub library is essentially a dummy library which defines the same symbols (functions etc.) as the "real" thing but has no implementation (functions simply return without doing anything). It's enough to make the linker happy, but the libraries are not shipped and their "real" counterparts are used at runtime.
You would need to get the source code for the two libraries, which reside in the following directories: libutils and libbinders
system/core/libutils
frameworks/native/libs/binder
Copy these two dirs into your project's jni dir. Then strip the code down:
* Edit Android.mk, removing all build targets other than BUILD_SHARED_LIBRARY.
* Edit the source code files, replacing all function bodies with a simple return. It doesn't matter what you return, as long as you get the code to compile.
Eventually you will probably need to prevent the stub libraries from getting included in your .apk (I have yet to figure out how to do that).
I am using https://github.com/lilac/Android-ImageMagick to build an ImageMagick library for Android. When trying to ndk-build ImageMagick I end up with the below errors.
primary0:AndroidMagickActivity primary0$ ~/ndk/ndk-build
SharedLibrary : libandroid-magick.so
/Users/primary0/ndk/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/libcoders.a(jpeg.o): in function ReadJPEGImage:jni/../ndk-modules/ImageMagick-6.7.3-0/coders/jpeg.c:988: error: undefined reference to 'jpeg_std_error'
/Users/primary0/ndk/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/libcoders.a(jpeg.o): in function ReadJPEGImage:jni/../ndk-modules/ImageMagick-6.7.3-0/coders/jpeg.c:995: error: undefined reference to 'jpeg_destroy_decompress'
/Users/primary0/ndk/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/libcoders.a(jpeg.o): in function ReadJPEGImage:jni/../ndk-modules/ImageMagick-6.7.3-0/coders/jpeg.c:1004: error: undefined reference to 'jpeg_CreateDecompress'
/Users/primary0/ndk/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/libcoders.a(jpeg.o): in function ReadJPEGImage:jni/../ndk-modules/ImageMagick-6.7.3-0/coders/jpeg.c:1006: error: undefined reference to 'jpeg_set_marker_processor'
/Users/primary0/ndk/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/libcoders.a(jpeg.o): in function ReadJPEGImage:jni/../ndk-modules/ImageMagick-6.7.3-0/coders/jpeg.c:1007: error: undefined reference to 'jpeg_set_marker_processor'
/Users/primary0/ndk/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/libcoders.a(jpeg.o): in function ReadJPEGImage:jni/../ndk-modules/ImageMagick-6.7.3-0/coders/jpeg.c:1008: error: undefined reference to 'jpeg_set_marker_
.
.
.
collect2: ld returned 1 exit status
make: *** [obj/local/armeabi/libandroid-magick.so] Error 1
primary0:AndroidMagickActivity primary0$
The header file that defines the constants listed in the error is included jpeg.c
#include "jpeglib.h"
Any of you guys have an idea why I'm getting the undefined reference error?
The linker is not looking for "constants" it's looking for jump addresses to call functions. Your code obviously uses functions which are not available in the object code. This can have various reasons. Either you did not tell the compiler to use a library which is availabe or (in your case more likely) you did not tell the compiler that jpeg.c also needs to be compiled for this shared object. But this is difficult to diagnose without seeing the makefile.
Taking a short look at the ndk-modules folder of the git repository I get the feeling you need to build multiple modules. Maybe you just do it in the wrong order. Try building jpeg first.