Russian Qt Forum

Компиляторы и платформы => Компиляторы => Тема начата: Fregloin от Май 29, 2015, 17:33



Название: Ошибка компиляции LDAP клиента при использовании -std=c++11
Отправлено: Fregloin от Май 29, 2015, 17:33
Привет. Столкнулся с такой проблемой. Есть библиотека интеграции LDAP в Qt (самописная). Все собиралось и работало до тех пор, пока не задействовал
ключ -std=c++11. После этого все что связанно с ldap не собирается, вылетает куча ошибок следующего характера:

mingw32-make: *** [sub-libs-railcore-make_first] Error 2
mingw32-make: *** Waiting for unfinished jobs....
In file included from ..\..\..\..\work\railroad\libs\ldap_auth\../ldap_auth/cldapauthclient.h:17:0,
                 from ..\..\..\..\work\railroad\libs\ldap_auth\cldapmanager.h:13,
                 from ..\..\..\..\work\railroad\libs\ldap_auth\cldapmanagerfactory.cpp:2:
C:/Qt/Tools/mingw491_32/i686-w64-mingw32/include/winldap.h:773:25: error: expected ')' before '*' token
   typedef ULONG (_cdecl *DBGPRINT)(PCH Format,...);
                         ^
C:/Qt/Tools/mingw491_32/i686-w64-mingw32/include/winldap.h:775:48: error: variable or field 'ldap_set_dbg_routine' declared void
   WINLDAPAPI VOID LDAPAPI ldap_set_dbg_routine(DBGPRINT DebugPrintRoutine);
                                                ^
C:/Qt/Tools/mingw491_32/i686-w64-mingw32/include/winldap.h:775:48: error: 'DBGPRINT' was not declared in this scope
C:/Qt/Tools/mingw491_32/i686-w64-mingw32/include/winldap.h:936:25: error: expected ')' before 'QUERYFORCONNECTION'
   typedef ULONG (_cdecl QUERYFORCONNECTION)(PLDAP PrimaryConnection,PLDAP ReferralFromConnection,PWCHAR NewDN,PCHAR HostName,ULONG PortNumber,PVOID SecAuthIdentity,PVOID CurrentUserToken,PLDAP *ConnectionToUse);
                         ^
C:/Qt/Tools/mingw491_32/i686-w64-mingw32/include/winldap.h:937:27: error: expected ')' before 'NOTIFYOFNEWCONNECTION'
   typedef BOOLEAN (_cdecl NOTIFYOFNEWCONNECTION) (PLDAP PrimaryConnection,PLDAP ReferralFromConnection,PWCHAR NewDN,PCHAR HostName,PLDAP NewConnection,ULONG PortNumber,PVOID SecAuthIdentity,PVOID CurrentUser,ULONG ErrorCodeFromBind);
                           ^
C:/Qt/Tools/mingw491_32/i686-w64-mingw32/include/winldap.h:938:25: error: expected ')' before 'DEREFERENCECONNECTION'
   typedef ULONG (_cdecl DEREFERENCECONNECTION)(PLDAP PrimaryConnection,PLDAP ConnectionToDereference);
                         ^
C:/Qt/Tools/mingw491_32/i686-w64-mingw32/include/winldap.h:942:5: error: 'QUERYFORCONNECTION' does not name a type
     QUERYFORCONNECTION *QueryForConnection;
     ^
C:/Qt/Tools/mingw491_32/i686-w64-mingw32/include/winldap.h:943:5: error: 'NOTIFYOFNEWCONNECTION' does not name a type
     NOTIFYOFNEWCONNECTION *NotifyRoutine;
     ^
C:/Qt/Tools/mingw491_32/i686-w64-mingw32/include/winldap.h:944:5: error: 'DEREFERENCECONNECTION' does not name a type
     DEREFERENCECONNECTION *DereferenceRoutine;
     ^
C:/Qt/Tools/mingw491_32/i686-w64-mingw32/include/winldap.h:954:27: error: expected ')' before 'QUERYCLIENTCERT'
   typedef BOOLEAN (_cdecl QUERYCLIENTCERT) (PLDAP Connection,PSecPkgContext_IssuerListInfoEx trusted_CAs,PCCERT_CONTEXT *ppCertificate);
                           ^
C:/Qt/Tools/mingw491_32/i686-w64-mingw32/include/winldap.h:955:27: error: expected ')' before 'VERIFYSERVERCERT'
   typedef BOOLEAN (_cdecl VERIFYSERVERCERT) (PLDAP Connection,PCCERT_CONTEXT pServerCert);
                           ^
..\..\..\..\work\railroad\libs\ldap_auth\cldapmanagerfactory.cpp: In member function 'virtual void CLDAPManagerFactory::createGlobalObject()':
..\..\..\..\work\railroad\libs\ldap_auth\cldapmanagerfactory.cpp:36:56: error: invalid new-expression of abstract class type 'CLDAPManager'
        CLDAPManager::p_instance = new CLDAPManager(this);
                                                        ^
In file included from ..\..\..\..\work\railroad\libs\ldap_auth\cldapmanagerfactory.cpp:2:0:
..\..\..\..\work\railroad\libs\ldap_auth\cldapmanager.h:16:30: note:   because the following virtual functions are pure within 'CLDAPManager':
 class LDAP_AUTHSHARED_EXPORT CLDAPManager : public CGlobalObject
                              ^
In file included from ..\..\..\..\work\railroad\libs\ldap_auth\cldapmanager.h:12:0,
                 from ..\..\..\..\work\railroad\libs\ldap_auth\cldapmanagerfactory.cpp:2:

Весь проект уже перенесен под использование этих расширений, а тут такой облом. Выяснилось это поздно потому что основное время
работаю под линуксом. Под виндой собирались версии без использования LDAP. Но нужно собрать также с его использованием. Откатываться назад не хочу. Можно как то побороть?


Название: Re: Ошибка компиляции LDAP клиента при использовании -std=c++11
Отправлено: Fregloin от Май 29, 2015, 17:59
Разобрался. Почему то эти функции на которые ругается компилятор описаны с аттрибутом _cdecl (одно подчеркивание). И новый компилятор этот атрибут в упор не видит.
Добавил строки
Код:
#ifndef _cdecl
#define _cdecl __cdecl //то что я добавил перед include
#endif

#include <winldap.h>
#include <winber.h>
#include <rpc.h>
#include <rpcdce.h>
и все собралось. Бред.


Название: Re: Ошибка компиляции LDAP клиента при использовании -std=c++11
Отправлено: AzazelloAV от Май 30, 2015, 23:59
Интересную тему подняли. Не в плане, конечно, компиляции.
Расскажите, если не жалко, какую нишу хотите занять. Я так понимаю вы "один в поле воин", что может быть недостатком как и преимуществом. К чему я? На самом деле конечных нормальных продуктов, качественных клиентов для LDAP я не встречал, поэтому интересует ваше направление.


Название: Re: Ошибка компиляции LDAP клиента при использовании -std=c++11
Отправлено: Fregloin от Май 31, 2015, 10:54
да простят модераторы за небольшой оффтоп. Пишется промышленно ПО. Клиент потребовал поддержку авторизации в active direvtory, так как у них все на нем держится. Раньше никогда с этим дело не имел, но вот столкнулся.
Готовых решений для Qt не нашлось, пришлось писать свое. Но мне достаточно пока просто проверка имени/пароля и принадлежность юзера к определенной группе. хотя в будущем по идее будет проверка прав пользователя на каждую операцию. Для отладки программа пишется без LDAP (вырезано ifdef-ами).


Название: Re: Ошибка компиляции LDAP клиента при использовании -std=c++11
Отправлено: AzazelloAV от Май 31, 2015, 12:45
да простят модераторы за небольшой оффтоп. Пишется промышленно ПО. Клиент потребовал поддержку авторизации в active direvtory

Понятно, частное решение для конкретной задачи. Хотя мне не понятно, причем здесь авторизация актив директори и лдап.  Т.е. вы напрямую решили обойти ай-пи актив директори, работая напрямую с базой лдап? Также интересует кросплатформенность, которая отсутсвует в лдап (в плане наявности библиотек, а не описания протокола). Вы используете API Windows, OpenLdap или свою реализацию? Если не жалко, ответте, т.к. темой LDAP интересуюсь давно, но кроме мысли реализации своего клиента на уровне сокетов ничего другого не приходит.


Название: Re: Ошибка компиляции LDAP клиента при использовании -std=c++11
Отправлено: Fregloin от Июнь 02, 2015, 10:21
Использую winAPI в обертке своего класса (через фасад решил сделать). напрямую я никуда не подключаюсь, все через winapi по примерам с msdn. В целом все работает как надо.
Программа должна проверять кто с ней работает и соотвественно проверять права на те или иные операции пользователя + выдавать некоторые данные, такие как ФИО и прочее.
По поводу кроссплатформенности - задачи как таковой что бы авторизация АД работала в линуксе нет, так как используются виндовые клиенты у этого заказчика. Все клиентские машины уже
в домене, поэтому такие и требования, хотя по факту сейчас на сколько я помню у них установлена версия без LDAP (сами же и попросили).


Название: Re: Ошибка компиляции LDAP клиента при использовании -std=c++11
Отправлено: Авварон от Июнь 03, 2015, 16:50
Вообще, было бы неплохо обернуть сишную лдаповскую либу в кутишный интерфейс (добавить асинхронности и сигналов). Могу рассказать подробнее в ИМ каком-нибудь. Вопрос в том - надо ли это кому-либо?)


Название: Re: Ошибка компиляции LDAP клиента при использовании -std=c++11
Отправлено: Bepec от Июнь 03, 2015, 17:04
оффтоп: много раз такой же вопрос приходил на ум. Пару тройку оберток сделал - раз в месяц кто то качал. Плюнул я на это дело :D