Android App Development include LDAP on MAC OS X
-
I want to add the ldap framework, which is located in xcode under /System/Library/Frameworks/LDAP.framework, to my qt application. The app should generate a android application.
I tried it first on a normal console application generated with qt. It works with the following .pro file:
QT -= gui CONFIG += c++11 console CONFIG -= app_bundle # The following define makes your compiler emit warnings if you use # any feature of Qt which as been marked deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += main.cpp \ ldapAuth.cpp \ user.cpp HEADERS += \ ldapAuth.h \ user.h mac: LIBS += -framework LDAP
After that I wanted to port it to the android application, but the compiler don't find the included ldap.h in my file.
# ekke (Ekkehard Gentz) @ekkescorner TEMPLATE = app TARGET = stacked_pages_x QT += qml quick core sql CONFIG += c++11 CONFIG -= app_bundle mac: LIBS += -F/System/Library/Frameworks/LDAP.framework mac: LIBS += -framework LDAP HEADERS += \ applicationui.hpp \ uiconstants.hpp \ handlenewstudent.h \ entities/admin.h \ dbhelper.h \ entities/student.h \ ldapAuth.h SOURCES += main.cpp \ applicationui.cpp \ handlenewstudent.cpp \ entities/admin.cpp \ dbhelper.cpp \ entities/student.cpp \ ldapAuth.cpp lupdate_only { SOURCES += main.qml \ common/*.qml \ pages/*.qml } OTHER_FILES += images/black/*.png \ images/black/x18/*.png \ images/black/x36/*.png \ images/black/x48/*.png \ images/white/*.png \ images/white/x18/*.png \ images/white/x36/*.png \ images/white/x48/*.png \ translations/*.* \ images/LICENSE \ LICENSE \ *.md RESOURCES += \ translations.qrc \ qml.qrc \ images.qrc # Additional import path used to resolve QML modules in Qt Creator's code model QML_IMPORT_PATH = # Default rules for deployment. include(deployment.pri) # T R A N S L A T I O N S # if languages are added: # 1. rebuild project to generate *.qm # 2. add existing .qm files to translations.qrc # if changes to translatable strings: # 1. Run Tools-External-Linguist-Update # 2. Run Linguist and do translations # 3. Build and run on iOS and Android to verify translations # 4. Optional: if translations not done: Run Tools-External-Linguist-Release # Supported languages LANGUAGES = de en # used to create .ts files defineReplace(prependAll) { for(a,$$1):result += $$2$${a}$$3 return($$result) } # Available translations tsroot = $$join(TARGET,,,.ts) tstarget = $$join(TARGET,,,_) TRANSLATIONS = $$PWD/translations/$$tsroot TRANSLATIONS += $$prependAll(LANGUAGES, $$PWD/translations/$$tstarget, .ts) # run LRELEASE to generate the qm files qtPrepareTool(LRELEASE, lrelease) for(tsfile, TRANSLATIONS) { command = $$LRELEASE $$tsfile system($$command)|error("Failed to run: $$command") } DISTFILES += \ pages/PageStudentNew.qml \ pages/PageItemOverview.qml \ pages/PageItemNew.qml \ pages/PageHome.qml \ pages/PageUserOverview.qml \ pages/PageUserNew.qml \ pages/PageBorrowedItemsOverview.qml \ pages/PageBorrowItem.qml \ pages/PageGiveBackItem.qml \ pages/PageLogin.qm
QT can't find the library, which is located in the ldap.h data.
What can I do to get it done ?
-
@mkmp29 said in Android App Development include LDAP on MAC OS X:
mac: LIBS += -F/System/Library/Frameworks/LDAP.framework
mac: LIBS += -framework LDAPYou are only including the framework on Mac.
In order to include a lib for Android, you need to:
- cross-compile that library using Android NDK
- import it in your .pro file
- if the library is a shared lib, you also need to add it to ANDROID_EXTRA_LIBS
-
I compiled the framework with this script:
#!/bin/bash #adjust export NDK_LOCATION="/Users/user123/Library/Android/sdk" export ANDROID_NDK_HOME="$NDK_LOCATION/ndk-bundle" export CC="arm-linux-androideabi-gcc" export CXX="arm-linux-androideabi-g++" export RANLIB="arm-linux-androideabi-ranlib" export LD="arm-linux-androideabi-ld" export AR="arm-linux-androideabi-ar" export CROSS_COMPILE="arm-linux-androideabi" #define android api export ANDROID_API=16 export CFLAGS="-D__ANDROID_API__=$ANDROID_API" #install toolchain ${ANDROID_NDK_HOME}/build/tools/make-standalone-toolchain.sh --platform=android-${ANDROID_API} --install-dir=${ANDROID_NDK_HOME}/android-toolchain export PATH="$PATH:$ANDROID_NDK_HOME/android-toolchain/bin" export LIB_DIR="`pwd`/lib" export LDAP_OUTPUT_DIR="${LIB_DIR}/compiled/OpenLDAP" #download lib #git clone https://github.com/openldap/openldap.git cd "$LIB_DIR/openldap" ./configure --host=${CROSS_COMPILE} --prefix="${LDAP_OUTPUT_DIR}" --with-yielding_select=yes make depend make && make install
And tried to add it in my pro file:
# ekke (Ekkehard Gentz) @ekkescorner TEMPLATE = app TARGET = stacked_pages_x QT += qml quick core sql CONFIG += c++11 INCLUDEPATH += lib/compiled/OpenLDAP/include LIBS += -L lib/compiled/OpenLDAP/lib -lldap ANDROID_EXTRA_LIBS += lib/compiled/OpenLDAP/lib/libldap.so HEADERS += \ handlenewstudent.h \ applicationui.hpp \ uiconstants.hpp \ entities/admin.h \ dbhelper.h \ entities/student.h \ handletextfield.h \ lists/studentlist.h \ entities/studentlistmodel.h\ ldapAuth.h SOURCES += main.cpp \ applicationui.cpp \ entities/admin.cpp \ dbhelper.cpp \ entities/student.cpp \ handletextfield.cpp \ lists/studentlist.cpp \ entities/studentlistmodel.cpp\ ldapAuth.cpp \ handlenewstudent.cpp lupdate_only { SOURCES += main.qml \ common/*.qml \ pages/*.qml } OTHER_FILES += images/black/*.png \ images/black/x18/*.png \ images/black/x36/*.png \ images/black/x48/*.png \ images/white/*.png \ images/white/x18/*.png \ images/white/x36/*.png \ images/white/x48/*.png \ translations/*.* \ images/LICENSE \ LICENSE \ *.md RESOURCES += \ translations.qrc \ qml.qrc \ images.qrc # Additional import path used to resolve QML modules in Qt Creator's code model QML_IMPORT_PATH = # Default rules for deployment. include(deployment.pri) # T R A N S L A T I O N S # if languages are added: # 1. rebuild project to generate *.qm # 2. add existing .qm files to translations.qrc # if changes to translatable strings: # 1. Run Tools-External-Linguist-Update # 2. Run Linguist and do translations # 3. Build and run on iOS and Android to verify translations # 4. Optional: if translations not done: Run Tools-External-Linguist-Release # Supported languages LANGUAGES = de en # used to create .ts files defineReplace(prependAll) { for(a,$$1):result += $$2$${a}$$3 return($$result) } # Available translations tsroot = $$join(TARGET,,,.ts) tstarget = $$join(TARGET,,,_) TRANSLATIONS = $$PWD/translations/$$tsroot TRANSLATIONS += $$prependAll(LANGUAGES, $$PWD/translations/$$tstarget, .ts) # run LRELEASE to generate the qm files qtPrepareTool(LRELEASE, lrelease) for(tsfile, TRANSLATIONS) { command = $$LRELEASE $$tsfile system($$command)|error("Failed to run: $$command") } DISTFILES += \ pages/PageStudentNew.qml \ pages/PageItemOverview.qml \ pages/PageItemNew.qml \ pages/PageHome.qml \ pages/PageUserOverview.qml \ pages/PageUserNew.qml \ pages/PageBorrowedItemsOverview.qml \ pages/PageBorrowItem.qml \ pages/PageGiveBackItem.qml \ pages/PageLogin.qml
But it still don't work, it throws errors that functions are not in the declared scope
/Edit: solved it, I used deprecated functionality of the library that can be enabled over the macro LDAP_DEPRECATED
-
@mkmp29 said in Android App Development include LDAP on MAC OS X:
But it still don't work, it throws errors that functions are not in the declared scope
What errors and where?
This line looks fishy to me:
--host=${CROSS_COMPILE}
The host is your host machine (your Mac), so it should rather be something like x86_64, and not the ARM architecture. But maybe LDAP is using some other convention, I don't know.
-
My error is:
:-1: error: error: cannot find -lldap
I think there is mistake in the .pro file:
The Filestructure is:
- *.pro - lib - compiled - OpenLDAP - lib - include - * - other files
in the lib directory are these files:
liblber-2-devel.so.0 libldap.la liblber-2-devel.so.0.0.0 libldap.so liblber.a libldap_r-2-devel.so.0 liblber.la libldap_r-2-devel.so.0.0.0 liblber.so libldap_r.a libldap-2-devel.so.0 libldap_r.la libldap-2-devel.so.0.0.0 libldap_r.so libldap.a
-
@mkmp29 said in Android App Development include LDAP on MAC OS X:
-L lib/compiled/OpenLDAP/lib -lldap
There should be no space between '-L' and your library search path.
-
@mkmp29 said in Android App Development include LDAP on MAC OS X:
INCLUDEPATH += lib/compiled/OpenLDAP/include
LIBS += -L lib/compiled/OpenLDAP/lib -lldap
ANDROID_EXTRA_LIBS += lib/compiled/OpenLDAP/lib/libldap.soDidn't work either. I just get the message for multiple lib function:
ldapAuth.o:ldapAuth.cpp:function LDAPAuth::~LDAPAuth(): error: undefined reference to 'ldap_unbind' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::~LDAPAuth(): error: undefined reference to 'ldap_unbind' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::checkStatus(QString const&, int): error: undefined reference to 'ldap_err2string' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::checkStatus(QString const&, int): error: undefined reference to 'ldap_err2string' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::init(): error: undefined reference to 'ldap_initialize' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::init(): error: undefined reference to 'ldap_initialize' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::init(): error: undefined reference to 'ldap_set_option' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::init(): error: undefined reference to 'ldap_set_option' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::init(): error: undefined reference to 'ldap_start_tls_s' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::init(): error: undefined reference to 'ldap_start_tls_s' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::init(): error: undefined reference to 'ldap_simple_bind_s' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::search(QString const&): error: undefined reference to 'ldap_search_ext_s' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::search(QString const&): error: undefined reference to 'ldap_first_entry' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::search(QString const&): error: undefined reference to 'ldap_get_dn' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::search(QString const&): error: undefined reference to 'ldap_first_attribute' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::search(QString const&): error: undefined reference to 'ldap_get_values' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::search(QString const&): error: undefined reference to 'ldap_next_attribute' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::search(QString const&): error: undefined reference to 'ldap_memfree' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::search(QString const&): error: undefined reference to 'ldap_next_entry' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::search(QString const&): error: undefined reference to 'ldap_msgfree' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::search(QString const&): error: undefined reference to 'ldap_msgfree' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::authentificate(QString const&, QString const&): error: undefined reference to 'ldap_simple_bind_s' collect2: error: ld returned 1 exit status
Looks like the library is compiled wrong ?
-
Hi,
Did you check the x86 vs x86_64 architecture for your library ?
-
No there's not.
The only alternative is to check whether your targets already have them available in their root filesystem and re-use them.
-
I can compile the application and push it to the virtual device. But i get the error:
W System.err: Caused by: java.lang.UnsatisfiedLinkError: dlopen failed: library "liblber-2-devel.so.0" not found
This file is contained in the lib folder of my cross compiled library. I read a little bit and tried to load the library during runtime with the QT Object: QLibrary and the function load. But it didnt work.
this is the part of my .pro file
ANDROID_EXTRA_LIBS += $$PWD/lib/compiled/openldap-i686-linux-android_16/lib/libldap.so ANDROID_EXTRA_LIBS += $$PWD/lib/compiled/openldap-i686-linux-android_16/lib/liblber.so ANDROID_EXTRA_LIBS += $$PWD/lib/compiled/openldap-i686-linux-android_16/lib/libldap_r.so #ANDROID_EXTRA_LIBS += $$PWD/lib/compiled/openldap-i686-linux-android_16/lib/liblber-2-devel.so.0 #ANDROID_EXTRA_LIBS += $$PWD/lib/compiled/openldap-i686-linux-android_16/lib/liblber-2-devel.so.0.0.0 #ANDROID_EXTRA_LIBS += $$PWD/lib/compiled/openldap-i686-linux-android_16/lib/libldap-2-devel.so.0 #ANDROID_EXTRA_LIBS += $$PWD/lib/compiled/openldap-i686-linux-android_16/lib/libldap-2-devel.so.0.0.0 #ANDROID_EXTRA_LIBS += $$PWD/lib/compiled/openldap-i686-linux-android_16/lib/libldap_r-2-devel.so.0 #ANDROID_EXTRA_LIBS += $$PWD/lib/compiled/openldap-i686-linux-android_16/lib/libldap_r-2-devel.so.0.0.0 LIBS += -L$$PWD/lib/compiled/openldap-i686-linux-android_16/lib/ -lldap INCLUDEPATH += $$PWD/lib/compiled/openldap-i686-linux-android_16/include DEPENDPATH += $$PWD/lib/compiled/openldap-i686-linux-android_16/include PRE_TARGETDEPS += $$PWD/lib/compiled/openldap-i686-linux-android_16/lib/libldap.a LIBS += -L$$PWD/lib/compiled/openldap-i686-linux-android_16/lib/ -llber INCLUDEPATH += $$PWD/lib/compiled/openldap-i686-linux-android_16/include DEPENDPATH += $$PWD/lib/compiled/openldap-i686-linux-android_16/include PRE_TARGETDEPS += $$PWD/lib/compiled/openldap-i686-linux-android_16/lib/liblber.a LIBS += -L$$PWD/lib/compiled/openldap-i686-linux-android_16/lib/ -lldap_r INCLUDEPATH += $$PWD/lib/compiled/openldap-i686-linux-android_16/include DEPENDPATH += $$PWD/lib/compiled/openldap-i686-linux-android_16/include PRE_TARGETDEPS += $$PWD/lib/compiled/openldap-i686-linux-android_16/lib/libldap_r.a
Library loading at the beginning of the main method.
QLibrary ldap("ldap"); QLibrary ldap_r("ldap_r"); QLibrary lber("lber"); if(!ldap.load() || !lber.load() || !ldap_r.load()){ qDebug() << "Failed loading library"; }
The libraries that are contained in the lib folder are listed above
-
IIRC, android doesn't support library versioning so ensure that you don't have a symbolic link copied to your package but a copy of the library.
-
@SGaist said in Android App Development include LDAP on MAC OS X:
IIRC, android doesn't support library versioning so ensure that you don't have a symbolic link copied to your package but a copy of the library.
I removed the links from the libraries, deleted the links and renamed the lib to its original name, but the error still appears...
-
Which one ? The missing symbol or the dlopen error ?
-
Why are you dlopening the library on Android rather than linking to it ?