May 2, 2020, 11:35 a.m.

Как в Qt подключить Firebase

Добрый день.
Нужно подключить Firebase к десктопной программе.
Скачал firebase_cpp_sdk и подключил так к проекту

INCLUDEPATH += E:/Programs/firebase_cpp_sdk/include

На этом моменте все компилируется. Потом добавляю

#include "firebase/auth.h"

и получаю 2 ошибки:

E:\QTProject\testFirebase\firebase.cpp:-1: ошибка: undefined reference to `firebase::g_auth_initializer'
:-1: ошибка: collect2.exe: error: ld returned 1 exit status

при этом firebase.cpp выглядит так:

#include "firebase.h"

Firebase::Firebase()
{

}
We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
10

Нашел в сдк дакой Cmake файл, может быть часть из него нужно добавлять в файл сборки проекта?

cmake_minimum_required(VERSION 3.1)

include(FindPkgConfig)

if (NOT DEFINED FIREBASE_CPP_SDK_DIR)
  set(FIREBASE_CPP_SDK_DIR ${CMAKE_CURRENT_SOURCE_DIR})
endif ()

# Determine the location of the libraries to use based on the platform.
if(ANDROID)
  string(REPLACE "_" ";" SPLIT_STL ${ANDROID_STL})
  list(GET SPLIT_STL 0 STL_DIR)
  set(FIREBASE_SDK_LIBDIR
      "${FIREBASE_CPP_SDK_DIR}/libs/android/${ANDROID_ABI}/${STL_DIR}")
elseif(APPLE)
  if(IOS)
    set(FIREBASE_SDK_LIBDIR ${FIREBASE_CPP_SDK_DIR}/libs/ios/universal)
  else() #Assume MacOS
    set(FIREBASE_SDK_LIBDIR ${FIREBASE_CPP_SDK_DIR}/libs/darwin/universal)
  endif()
elseif(MSVC)
  if(${CMAKE_CL_64})
    set(MSVC_CPU x64)
  else()
    set(MSVC_CPU x86)
  endif()
  if(CMAKE_BUILD_TYPE STREQUAL Release)
    set(MSVC_CONFIG Release)
  else()
    set(MSVC_CONFIG Debug)
  endif()
  set(MSVC_VS_VERSION VS2015)
  set(FIREBASE_SDK_LIBDIR
      ${FIREBASE_CPP_SDK_DIR}/libs/windows/${MSVC_VS_VERSION}/${MSVC_RUNTIME_MODE}/${MSVC_CPU}/${MSVC_CONFIG})
else()
  # The Firebase libraries are not built with glibcxx11, so disable the ABI.
  set(DISABLE_CXX11 TRUE)
  set(LINUX_CPU x86_64)
  set(FIREBASE_SDK_LIBDIR ${FIREBASE_CPP_SDK_DIR}/libs/linux/${LINUX_CPU})
endif()

# Defines a Firebase target, linking it with the correct prebuilt library.
function(add_firebase_target TARGET_NAME)
  if(NOT DEFINED ${TARGET_NAME})
    if(MSVC)
      set(LIBRARY_NAME "${TARGET_NAME}.lib")
    else()
      set(LIBRARY_NAME "lib${TARGET_NAME}.a")
    endif()
    add_library(${TARGET_NAME} STATIC IMPORTED GLOBAL)
    set_target_properties(${TARGET_NAME} PROPERTIES
      IMPORTED_LOCATION "${FIREBASE_SDK_LIBDIR}/${LIBRARY_NAME}"
      INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_LIST_DIR}/include"
    )
    if(${DISABLE_CXX11})
      set_target_properties(${TARGET_NAME} PROPERTIES
        INTERFACE_COMPILE_DEFINITIONS "_GLIBCXX_USE_CXX11_ABI=0"
      )
    endif()
  endif()
endfunction()

# Define targets for all the Firebase libraries
add_firebase_target(firebase_app)
add_firebase_target(firebase_admob)
add_firebase_target(firebase_analytics)
add_firebase_target(firebase_auth)
add_firebase_target(firebase_database)
add_firebase_target(firebase_dynamic_links)
add_firebase_target(firebase_firestore)
add_firebase_target(firebase_functions)
add_firebase_target(firebase_instance_id)
add_firebase_target(firebase_messaging)
add_firebase_target(firebase_performance)
add_firebase_target(firebase_remote_config)
add_firebase_target(firebase_storage)
add_firebase_target(firebase_testlab)

# Auth on Linux desktop has an additional dependency on libsecret,
# which needs to be added. If it cannot be found, we don't want to
# error, since the user might not be using auth, and the user will
# get a linker error if it is needed.
if(NOT APPLE AND NOT ANDROID AND UNIX)
  pkg_check_modules(LIBSECRET libsecret-1)

  if(NOT LIBSECRET_FOUND)
    message(WARNING "Unable to find libsecret, which is needed by Linux \
                     desktop implementations of Auth, Instance ID, and \
                     Remote Config. \
                     It can be installed on supported systems via: \
                     apt-get install libsecret-1-dev")
  else()
    set_target_properties(firebase_auth PROPERTIES
      INTERFACE_INCLUDE_DIRECTORIES "${LIBSECRET_INCLUDE_DIRS}"
      INTERFACE_LINK_LIBRARIES "${LIBSECRET_LIBRARIES}"
    )
    set_target_properties(firebase_instance_id PROPERTIES
      INTERFACE_INCLUDE_DIRECTORIES "${LIBSECRET_INCLUDE_DIRS}"
      INTERFACE_LINK_LIBRARIES "${LIBSECRET_LIBRARIES}"
    )
    set_target_properties(firebase_remote_config PROPERTIES
      INTERFACE_INCLUDE_DIRECTORIES "${LIBSECRET_INCLUDE_DIRS}"
      INTERFACE_LINK_LIBRARIES "${LIBSECRET_LIBRARIES}"
    )
  endif()
endif()

Ну я наткнулся в интернете вот на такую вещь

LOCAL_STATIC_LIBRARIES := cocos2dx_static \
firebase_analytics \
firebase_auth \
firebase_database \
firebase_app

Это вроде как правильная последовательность линковки библиотек при той ошибке. Я так понимаю, у вас скорее всего не слинкована библиотека firebase_auth

Добавил это в про файл и получил такую ошибку

 ошибка: Assignment needs exactly one word on the left hand side.

Это не для pro файла, в pro файле это и не заработает. Это просто была информация. Может быть для CMake, может быть ещё для чего-то.
Смысл в том, что там необходимо прилинковать необходимые бибилотеки. Я не знаю, как у вас там сделана линковка библиотек, да и каких именно также не знаю.
Firebase тоже не собирал с Qt, просто исходя из той ошибки, делаю выводы о неправильной линковке.

Я попробовал так линковать, но это не помогло.
Нужно наверно попробовать Ваш вариант в симэйке

LIBS += "E:/Programs/firebase_cpp_sdk/libs/windows/VS2015/MT/x64/Debug/firebase_admob.lib"
LIBS += "E:/Programs/firebase_cpp_sdk/libs/windows/VS2015/MT/x64/Debug/firebase_analytics.lib"
LIBS += "E:/Programs/firebase_cpp_sdk/libs/windows/VS2015/MT/x64/Debug/firebase_app.lib"
LIBS += "E:/Programs/firebase_cpp_sdk/libs/windows/VS2015/MT/x64/Debug/firebase_auth.lib"
LIBS += "E:/Programs/firebase_cpp_sdk/libs/windows/VS2015/MT/x64/Debug/firebase_database.lib"
LIBS += "E:/Programs/firebase_cpp_sdk/libs/windows/VS2015/MT/x64/Debug/firebase_dynamic_links.lib"
LIBS += "E:/Programs/firebase_cpp_sdk/libs/windows/VS2015/MT/x64/Debug/firebase_firestore.lib"
LIBS += "E:/Programs/firebase_cpp_sdk/libs/windows/VS2015/MT/x64/Debug/firebase_functions.lib"
LIBS += "E:/Programs/firebase_cpp_sdk/libs/windows/VS2015/MT/x64/Debug/firebase_instance_id.lib"
LIBS += "E:/Programs/firebase_cpp_sdk/libs/windows/VS2015/MT/x64/Debug/firebase_messaging.lib"
LIBS += "E:/Programs/firebase_cpp_sdk/libs/windows/VS2015/MT/x64/Debug/firebase_remote_config.lib"
LIBS += "E:/Programs/firebase_cpp_sdk/libs/windows/VS2015/MT/x64/Debug/firebase_storage.lib"

Полагаю, вам ещё нужны заголовочные файлы, которые подключаются через INCLUDEPATH += ...

Я их подключил в qmake так

INCLUDEPATH += E:/Programs/firebase_cpp_sdk/include

А как их подключить в Cmake?

В этой статье есть пример со статической библиотекой. Там проект не для Qt, а для обычного C++ проекта, но смысл, думаю, уловите.

CMake проект с поддиректориями и статической библиотекой

Сделал в симэйке так, но тоже не работает

include_directories("E:/Programs/firebase_cpp_sdk/include")
LOCAL_STATIC_LIBRARIES := cocos2dx_static \
firebase_analytics \
firebase_auth \
firebase_database \
firebase_app

выдает ошибку при компиляции

E:\QTProject\testFirebaseCmake\CMakeLists.txt:50: ошибка: Parse error.  Expected "(", got unquoted argument with text ":=".

Попробовал так сделать в симэйке

include_directories("E:/Programs/firebase_cpp_sdk/include")
add_library(firebase_admob STATIC "E:/Programs/firebase_cpp_sdk/libs/windows/VS2015/MT/x64/Debug/firebase_admob.lib")
add_library(firebase_analytics STATIC "E:/Programs/firebase_cpp_sdk/libs/windows/VS2015/MT/x64/Debug/firebase_analytics.lib")
add_library(firebase_app STATIC "E:/Programs/firebase_cpp_sdk/libs/windows/VS2015/MT/x64/Debug/firebase_app.lib")
add_library(firebase_auth STATIC "E:/Programs/firebase_cpp_sdk/libs/windows/VS2015/MT/x64/Debug/firebase_auth.lib")
add_library(firebase_database STATIC "E:/Programs/firebase_cpp_sdk/libs/windows/VS2015/MT/x64/Debug/firebase_database.lib")
add_library(firebase_dynamic_links STATIC "E:/Programs/firebase_cpp_sdk/libs/windows/VS2015/MT/x64/Debug/firebase_dynamic_links.lib")
add_library(firebase_firestore STATIC ""E:/Programs/firebase_cpp_sdk/libs/windows/VS2015/MT/x64/Debug/firebase_firestore.lib")
add_library(firebase_functions STATIC "E:/Programs/firebase_cpp_sdk/libs/windows/VS2015/MT/x64/Debug/firebase_functions.lib")
add_library(firebase_instance_id STATIC "E:/Programs/firebase_cpp_sdk/libs/windows/VS2015/MT/x64/Debug/firebase_instance_id.lib")
add_library(firebase_messaging STATIC "E:/Programs/firebase_cpp_sdk/libs/windows/VS2015/MT/x64/Debug/firebase_messaging.lib")
add_library(firebase_remote_config STATIC "E:/Programs/firebase_cpp_sdk/libs/windows/VS2015/MT/x64/Debug/firebase_remote_config.lib")
add_library(firebase_storage STATIC "E:/Programs/firebase_cpp_sdk/libs/windows/VS2015/MT/x64/Debug/firebase_storage.lib")

и получил такие ошибки

E:\QTProject\testFirebaseCmake\CMakeLists.txt:66: ошибка: Parse error.  Function missing ending ")".  Instead found unterminated string with text ")

Comments

Only authorized users can post comments.
Please, Log in or Sign up
How to become an author?

Contribute to the evolution of the EVILEG community.

Learn how to become a site author.

Learn it
Donate

Good day, Dear Users!!!

I am Evgenii Legotckoi, developer of EVILEG. And it is my hobby project, which helps to learn programming another programmers and developers

If the site helped you, and you want also support the development of the site, than you can donate by following ways

PayPalYandex.Money
Timeweb

Let me recommend you the excellent hosting on which EVILEG is located.

For many years, Timeweb has been proving his stability.

For projects on Django I recommend VDS hosting

View Hosting Timeweb
AS
May 26, 2020, 12:29 p.m.
Artem Sun-Dun-Chan

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:50points,
  • Rating points-4
MN
May 25, 2020, 12:33 p.m.
Mitja Nagibin

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:50points,
  • Rating points-4
f
May 25, 2020, 6:05 a.m.
falcon

C++ - Test 001. The first program and data types

  • Result:66points,
  • Rating points-1
Last comments
May 29, 2020, 7:30 a.m.
Evgenij Legotskoj

Qt/C++ - Lesson 039. How to paint stroke in QSqlTableModel by value in the column?

У меня работает. Исправлял в проекте, который приложен к статье. А что происходит в вашем коде, с учётом места вызова этого кода, я знать не могу ;) Дебажьте и добавляйте условия, кото…
MA
May 29, 2020, 7:27 a.m.
Mihail A

Qt/C++ - Lesson 039. How to paint stroke in QSqlTableModel by value in the column?

QModelIndexList rowIndexes = ui->tableView->selectionModel()->selectedRows(); model->removeRows(rowIndexes.first().row(), rowIndexes.size()); model-&…
May 29, 2020, 7:14 a.m.
Evgenij Legotskoj

Django - Tutorial 036. How to add authentication through social networks. VKontakte

Неправильно прописали URL, на который возвращается ответ от OAuth ВКонтакте. Настраивайте ваше приложение в консоли разработчика ВКонтакте
AL
May 29, 2020, 6:24 a.m.
Aleksandr Leonidov

Django - Tutorial 036. How to add authentication through social networks. VKontakte

Здравствуйте! После клика на ссылку авторизации выдает json словарь с ошибкой: {"error":"invalid_request","error_description":"redirect_uri is incorrect, check application redirect uri in …
May 28, 2020, 4:14 p.m.
Evgenij Legotskoj

Qt/C++ - Lesson 039. How to paint stroke in QSqlTableModel by value in the column?

Ну в моём примере, который в статье сработало так model->setData(model->index(1, 1), 7); Поскольку model->index(1, 0) - это индекс колонки id, которая скрыта, поэтому…
Now discuss on the forum
DK
May 29, 2020, 9:44 a.m.
Dzhon Kofi

QMap<> какой ключ лучше

Привет. Есть QModelIndex и QString (одно слово, а чаще значение, как int). Что лучше поставить ключом индекс или строку? Данных мало, почти всегда 1.
May 29, 2020, 8:52 a.m.
Vladimir Sergeevich

Масштабирование двумя пальцами на мобильных платформах

Я планировал описать этот момент на блоге, но никак руки не доходят (уже год). Летом дойдут. Тем не менее, у меня в репозитории лежит рабочий код игрушки "пазлы", где есть все это. …
May 29, 2020, 7:51 a.m.
Evgenij Legotskoj

Графическое ускорение

Зависит от платформы и поддерживаемых технологий. В QML в первую очередь используется OpenGL и отрисовка производится средствами GPU. Но может переключаться на использование CPU и прог…
IP
May 29, 2020, 2:55 a.m.
Igor' Poroshin

QTablwView + QSqlQueryModel скрыть пустой столбец

Да, понятно. В данном случае лучше использовать серверную процедуру (если такие поддерживаются), в которой будет проверяться наличие всех пустых строк у нужного столбца и вызываться соответ…
RG
May 28, 2020, 7:21 p.m.
Rovshan Gurbanov

Сборка под старые версии Android

У меня SDK почти все версии есть, NDK есть версии 10, 17, 21. Но собирается приложение только с NDK v21 под Android версии 7.0 и выше Версия Qt у меня 5.14.2
About
Services
© EVILEG 2015-2020
Recommend hosting TIMEWEB