LINUX.ORG.RU

ldapc++ undefined reference to

 , , ,


0

1

Привет ЛОР!

У openldap'a в contrib есть библиотека ldapc++. Соответственно, мне захотелось ей воспользоваться, но я столкнулся с проблемой:

/media/storage/Projects/Parusyncka/userldapwriter.cpp:7: ошибка: undefined reference to `vtable for UserLDAPWriter'
/media/storage/Projects/Parusyncka/userldapwriter.cpp:7: ошибка: undefined reference to `LDAPConstraints::LDAPConstraints()'
/media/storage/Projects/Parusyncka/userldapwriter.cpp:7: ошибка: undefined reference to `LDAPConnection::LDAPConnection(std::string const&, int, LDAPConstraints*)'
/media/storage/Projects/Parusyncka/userldapwriter.cpp:10: ошибка: undefined reference to `LDAPConnection::bind(std::string const&, std::string const&, LDAPConstraints*)'
/media/storage/Projects/Parusyncka/userldapwriter.cpp:12: ошибка: undefined reference to `LDAPException::~LDAPException()'
/media/storage/Projects/Parusyncka/userldapwriter.cpp:14: ошибка: undefined reference to `LDAPException::getResultMsg() const'
/media/storage/Projects/Parusyncka/userldapwriter.cpp:12: ошибка: undefined reference to `LDAPException::~LDAPException()'
/media/storage/Projects/Parusyncka/userldapwriter.cpp:7: ошибка: undefined reference to `LDAPConnection::~LDAPConnection()'
/media/storage/Projects/Parusyncka/userldapwriter.cpp:21: ошибка: undefined reference to `StringList::StringList()'
/media/storage/Projects/Parusyncka/userldapwriter.cpp:21: ошибка: undefined reference to `LDAPConnection::search(std::string const&, int, std::string const&, StringList const&, bool, LDAPConstraints const*)'
/media/storage/Projects/Parusyncka/userldapwriter.cpp:21: ошибка: undefined reference to `StringList::~StringList()'
/media/storage/Projects/Parusyncka/userldapwriter.cpp:26: ошибка: undefined reference to `LDAPEntry::getDN() const'
/media/storage/Projects/Parusyncka/userldapwriter.cpp:24: ошибка: undefined reference to `LDAPSearchResults::getNext()'
/media/storage/Projects/Parusyncka/userldapwriter.cpp:21: ошибка: undefined reference to `StringList::~StringList()'
/media/storage/Projects/Parusyncka/libldapcpp/include/LDAPException.h:23: ошибка: undefined reference to `vtable for LDAPException'
(.gcc_except_table+0x30):-1: ошибка: undefined reference to `typeinfo for LDAPException'
:-1: ошибка: collect2: error: ld returned 1 exit status
ls -l /media/storage/Projects/Parusyncka/libldapcpp/lib 
итого 10956
-rw-r--r--. 1 ivan ivan 8182356 дек 12 15:35 libldapcpp.a
-rwxr-xr-x. 1 ivan ivan     853 дек 12 15:35 libldapcpp.la
lrwxrwxrwx. 1 ivan ivan      19 дек 12 15:35 libldapcpp.so -> libldapcpp.so.0.0.0
lrwxrwxrwx. 1 ivan ivan      19 дек 12 15:35 libldapcpp.so.0 -> libldapcpp.so.0.0.0
-rwxr-xr-x. 1 ivan ivan 3029195 дек 12 15:35 libldapcpp.so.0.0.0

Кусок Parusyncka.pro:

INCLUDEPATH += "/usr/include/oracle/12.1/client64"
INCLUDEPATH += "/usr/include"
INCLUDEPATH += "libldapcpp/include"

QMAKE_RPATHDIR += "/usr/lib/oracle/12.1/client64/lib"
QMAKE_RPATHDIR += "/media/storage/Projects/Parusyncka/libldapcpp/lib"

Если добавить в .pro файл LIBS += "-llibldapcpp", то ld говорит от том, что не может найти libldapcpp.

Соответственно три вопроса:

  • ЧЯДНТ?
  • Есть .a, есть .la, есть .so. Какой из них лучше использовать и как? Меня вполне устроит распространять либу вместе с приложением, ибо либы всё равно в репах нет. Никаких действий для подключения динамических библиотек не предпринимал.
  • Если кинетесь ссылкой на небольшое, но понятное объяснение, как вообще все эти библиотеки подключать/использовать буду благодарен.

И последнее readelf --dyn-syms -W lib/libldapcpp.so

★★★★★

1. lib - лишнее

2. посмори через equery какие файлы пакет поставил в систему, ну и грепни по .so

Stil ★★★★★ ()
Ответ на: комментарий от Stil

1. lib - лишнее

Где именно лишнее? LIBS += "-lldapcpp"

2. посмори через equery какие файлы пакет поставил в систему, ну и грепни по .so

У меня не гента, а федора. ldapc++ собирался отдельно, ./configure && make && make install в chroot, после чего include и lib скопированы в директорию проекта и прописаны в INCLUDEPATH и QMAKE_RPATHDIR. В README написано, что ldapc++ зависит только от openldap-devel, он установлен.

Ivan_qrt ★★★★★ ()
Последнее исправление: Ivan_qrt (всего исправлений: 1)

На всякий случай напоминаю, что нельзя просто всять и слинковать либы и бинари скомпиленых для разных платформ. Не в этом ли проблема?

nanoolinux ★★★★ ()
Ответ на: комментарий от nanoolinux

Компилируется в федоре 19 и в chroot`e федоры 19, сделанного при помощи mock'а. Оба 64-бита, сырцы взяты из src.rpm текущей версии openldap'а.

Ivan_qrt ★★★★★ ()
Ответ на: комментарий от Ivan_qrt

Где именно лишнее? LIBS += "-lldapcpp"

ага

У меня не гента, а федора. ldapc++ собирался отдельно, ./configure && make && make install в chroot, после чего include и lib скопированы в директорию проекта и прописаны в INCLUDEPATH и QMAKE_RPATHDIR. В README написано, что ldapc++ зависит только от openldap-devel, он установлен.

тогда извините, libastral сырой :)

Stil ★★★★★ ()
Ответ на: комментарий от nanoolinux
17:52:04: Выполняются этапы для проекта Parusyncka...
17:52:04: Настройки не изменились, этап qmake пропускается.
17:52:04: Запускается: «/usr/bin/make» 
g++ -c -pipe -std=c++11 -g -Wall -W -D_REENTRANT -DQT_DEBUG_PLUGINS -DQT_SQL_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/lib64/qt4/mkspecs/linux-g++ -I../../../Parusyncka -I/usr/include/QtCore -I/usr/include/QtSql -I/usr/include -I/usr/include/oracle/12.1/client64 -I/usr/include -I../../../Parusyncka/libldapcpp/include -I. -I../../../Parusyncka -I. -o main.o ../../../Parusyncka/main.cpp
In file included from ../../../Parusyncka/libldapcpp/include/LDAPConnection.h:12:0,
                 from ../../../Parusyncka/userldapwriter.h:7,
                 from ../../../Parusyncka/main.cpp:7:
../../../Parusyncka/libldapcpp/include/LDAPAsynConnection.h:310:9: warning: unused parameter 'lc' [-Wunused-parameter]
         LDAPAsynConnection(const LDAPAsynConnection& lc){};
         ^
../../../Parusyncka/main.cpp: In function 'int main(int, char**)':
../../../Parusyncka/main.cpp:94:25: warning: unused variable 'uw' [-Wunused-variable]
         UserLDAPWriter *uw = new UserLDAPWriter(ldap_url, ldap_ro_bind_user, ldap_ro_bind_pass, ldap_domain_suffix);
                         ^
../../../Parusyncka/main.cpp: At global scope:
../../../Parusyncka/main.cpp:30:5: warning: unused parameter 'argc' [-Wunused-parameter]
 int main(int argc, char *argv[])
     ^
../../../Parusyncka/main.cpp:30:5: warning: unused parameter 'argv' [-Wunused-parameter]
g++ -c -pipe -std=c++11 -g -Wall -W -D_REENTRANT -DQT_DEBUG_PLUGINS -DQT_SQL_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/lib64/qt4/mkspecs/linux-g++ -I../../../Parusyncka -I/usr/include/QtCore -I/usr/include/QtSql -I/usr/include -I/usr/include/oracle/12.1/client64 -I/usr/include -I../../../Parusyncka/libldapcpp/include -I. -I../../../Parusyncka -I. -o usersqlprovider.o ../../../Parusyncka/usersqlprovider.cpp
g++ -c -pipe -std=c++11 -g -Wall -W -D_REENTRANT -DQT_DEBUG_PLUGINS -DQT_SQL_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/lib64/qt4/mkspecs/linux-g++ -I../../../Parusyncka -I/usr/include/QtCore -I/usr/include/QtSql -I/usr/include -I/usr/include/oracle/12.1/client64 -I/usr/include -I../../../Parusyncka/libldapcpp/include -I. -I../../../Parusyncka -I. -o usercsvprovider.o ../../../Parusyncka/usercsvprovider.cpp
g++ -c -pipe -std=c++11 -g -Wall -W -D_REENTRANT -DQT_DEBUG_PLUGINS -DQT_SQL_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/lib64/qt4/mkspecs/linux-g++ -I../../../Parusyncka -I/usr/include/QtCore -I/usr/include/QtSql -I/usr/include -I/usr/include/oracle/12.1/client64 -I/usr/include -I../../../Parusyncka/libldapcpp/include -I. -I../../../Parusyncka -I. -o userinfo.o ../../../Parusyncka/userinfo.cpp
g++ -c -pipe -std=c++11 -g -Wall -W -D_REENTRANT -DQT_DEBUG_PLUGINS -DQT_SQL_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/lib64/qt4/mkspecs/linux-g++ -I../../../Parusyncka -I/usr/include/QtCore -I/usr/include/QtSql -I/usr/include -I/usr/include/oracle/12.1/client64 -I/usr/include -I../../../Parusyncka/libldapcpp/include -I. -I../../../Parusyncka -I. -o conv.o ../../../Parusyncka/conv.cpp
g++ -c -pipe -std=c++11 -g -Wall -W -D_REENTRANT -DQT_DEBUG_PLUGINS -DQT_SQL_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/lib64/qt4/mkspecs/linux-g++ -I../../../Parusyncka -I/usr/include/QtCore -I/usr/include/QtSql -I/usr/include -I/usr/include/oracle/12.1/client64 -I/usr/include -I../../../Parusyncka/libldapcpp/include -I. -I../../../Parusyncka -I. -o userldapwriter.o ../../../Parusyncka/userldapwriter.cpp
In file included from ../../../Parusyncka/libldapcpp/include/LDAPConnection.h:12:0,
                 from ../../../Parusyncka/userldapwriter.h:7,
                 from ../../../Parusyncka/userldapwriter.cpp:1:
../../../Parusyncka/libldapcpp/include/LDAPAsynConnection.h:310:9: warning: unused parameter 'lc' [-Wunused-parameter]
         LDAPAsynConnection(const LDAPAsynConnection& lc){};
         ^
../../../Parusyncka/userldapwriter.cpp:18:5: warning: unused parameter 'useruid' [-Wunused-parameter]
 int UserLDAPWriter::finduser(UserInfo &user, std::string &useruid)
     ^
g++ -Wl,-rpath,/usr/lib/oracle/12.1/client64/lib -Wl,-rpath,/media/storage/Projects/Parusyncka/libldapcpp/lib -o Parusyncka main.o usersqlprovider.o usercsvprovider.o userinfo.o conv.o userldapwriter.o    -L/usr/lib64 -lQtSql -lQtCore -lpthread 
userldapwriter.o: In function `UserLDAPWriter::UserLDAPWriter(std::string const&, std::string, std::string, std::string const&)':
/media/storage/Projects/build/Parusyncka/Debug/../../../Parusyncka/userldapwriter.cpp:7: undefined reference to `vtable for UserLDAPWriter'
/media/storage/Projects/build/Parusyncka/Debug/../../../Parusyncka/userldapwriter.cpp:7: undefined reference to `LDAPConstraints::LDAPConstraints()'
/media/storage/Projects/build/Parusyncka/Debug/../../../Parusyncka/userldapwriter.cpp:7: undefined reference to `LDAPConnection::LDAPConnection(std::string const&, int, LDAPConstraints*)'
/media/storage/Projects/build/Parusyncka/Debug/../../../Parusyncka/userldapwriter.cpp:10: undefined reference to `LDAPConnection::bind(std::string const&, std::string const&, LDAPConstraints*)'
/media/storage/Projects/build/Parusyncka/Debug/../../../Parusyncka/userldapwriter.cpp:12: undefined reference to `LDAPException::~LDAPException()'
/media/storage/Projects/build/Parusyncka/Debug/../../../Parusyncka/userldapwriter.cpp:14: undefined reference to `LDAPException::getResultMsg() const'
/media/storage/Projects/build/Parusyncka/Debug/../../../Parusyncka/userldapwriter.cpp:12: undefined reference to `LDAPException::~LDAPException()'
/media/storage/Projects/build/Parusyncka/Debug/../../../Parusyncka/userldapwriter.cpp:7: undefined reference to `LDAPConnection::~LDAPConnection()'
userldapwriter.o: In function `UserLDAPWriter::finduser(UserInfo&, std::string&)':
/media/storage/Projects/build/Parusyncka/Debug/../../../Parusyncka/userldapwriter.cpp:21: undefined reference to `StringList::StringList()'
/media/storage/Projects/build/Parusyncka/Debug/../../../Parusyncka/userldapwriter.cpp:21: undefined reference to `LDAPConnection::search(std::string const&, int, std::string const&, StringList const&, bool, LDAPConstraints const*)'
/media/storage/Projects/build/Parusyncka/Debug/../../../Parusyncka/userldapwriter.cpp:21: undefined reference to `StringList::~StringList()'
/media/storage/Projects/build/Parusyncka/Debug/../../../Parusyncka/userldapwriter.cpp:26: undefined reference to `LDAPEntry::getDN() const'
/media/storage/Projects/build/Parusyncka/Debug/../../../Parusyncka/userldapwriter.cpp:24: undefined reference to `LDAPSearchResults::getNext()'
/media/storage/Projects/build/Parusyncka/Debug/../../../Parusyncka/userldapwriter.cpp:21: undefined reference to `StringList::~StringList()'
userldapwriter.o: In function `LDAPException::LDAPException(LDAPException const&)':
/media/storage/Projects/build/Parusyncka/Debug/../../../Parusyncka/libldapcpp/include/LDAPException.h:23: undefined reference to `vtable for LDAPException'
userldapwriter.o:(.gcc_except_table+0x30): undefined reference to `typeinfo for LDAPException'
collect2: error: ld returned 1 exit status
make: *** [Parusyncka] Error 1
17:52:09: Процесс «/usr/bin/make» завершился с кодом 2.
Ошибка при сборке/установке проекта Parusyncka (комплект: Desktop)
Во время выполнения этапа «Сборка»
17:52:09: Прошло времени: 00:05.
Ivan_qrt ★★★★★ ()
Ответ на: комментарий от Stil

На всякий случай уточню, в chroot`e, сделанном mock`oм вываливается с теми же ошибками, хотя другие пакеты там собираются нормально.

Ivan_qrt ★★★★★ ()
Ответ на: комментарий от nanoolinux

Сделал в parusyncka.pro LIBS += "-L/media/storage/Projects/Parusyncka/libldapcpp/lib" . Сделал clean, всё пересобрал.

g++ -Wl,-rpath,/usr/lib/oracle/12.1/client64/lib -o Parusyncka main.o usersqlprovider.o usercsvprovider.o userinfo.o conv.o userldapwriter.o    -L/usr/lib64 -L/media/storage/Projects/Parusyncka/libldapcpp/lib -lQtSql -lQtCore -lpthread 
userldapwriter.o: In function `UserLDAPWriter::UserLDAPWriter(std::string const&, std::string, std::string, std::string const&)':
/media/storage/Projects/build/Parusyncka/Debug/../../../Parusyncka/userldapwriter.cpp:7: undefined reference to `vtable for UserLDAPWriter'
/media/storage/Projects/build/Parusyncka/Debug/../../../Parusyncka/userldapwriter.cpp:7: undefined reference to `LDAPConstraints::LDAPConstraints()'
/media/storage/Projects/build/Parusyncka/Debug/../../../Parusyncka/userldapwriter.cpp:7: undefined reference to `LDAPConnection::LDAPConnection(std::string const&, int, LDAPConstraints*)'
/media/storage/Projects/build/Parusyncka/Debug/../../../Parusyncka/userldapwriter.cpp:10: undefined reference to `LDAPConnection::bind(std::string const&, std::string const&, LDAPConstraints*)'
/media/storage/Projects/build/Parusyncka/Debug/../../../Parusyncka/userldapwriter.cpp:12: undefined reference to `LDAPException::~LDAPException()'
/media/storage/Projects/build/Parusyncka/Debug/../../../Parusyncka/userldapwriter.cpp:14: undefined reference to `LDAPException::getResultMsg() const'
/media/storage/Projects/build/Parusyncka/Debug/../../../Parusyncka/userldapwriter.cpp:12: undefined reference to `LDAPException::~LDAPException()'
/media/storage/Projects/build/Parusyncka/Debug/../../../Parusyncka/userldapwriter.cpp:7: undefined reference to `LDAPConnection::~LDAPConnection()'
userldapwriter.o: In function `UserLDAPWriter::finduser(UserInfo&, std::string&)':
/media/storage/Projects/build/Parusyncka/Debug/../../../Parusyncka/userldapwriter.cpp:21: undefined reference to `StringList::StringList()'
/media/storage/Projects/build/Parusyncka/Debug/../../../Parusyncka/userldapwriter.cpp:21: undefined reference to `LDAPConnection::search(std::string const&, int, std::string const&, StringList const&, bool, LDAPConstraints const*)'
/media/storage/Projects/build/Parusyncka/Debug/../../../Parusyncka/userldapwriter.cpp:21: undefined reference to `StringList::~StringList()'
/media/storage/Projects/build/Parusyncka/Debug/../../../Parusyncka/userldapwriter.cpp:26: undefined reference to `LDAPEntry::getDN() const'
/media/storage/Projects/build/Parusyncka/Debug/../../../Parusyncka/userldapwriter.cpp:24: undefined reference to `LDAPSearchResults::getNext()'
/media/storage/Projects/build/Parusyncka/Debug/../../../Parusyncka/userldapwriter.cpp:21: undefined reference to `StringList::~StringList()'
userldapwriter.o: In function `LDAPException::LDAPException(LDAPException const&)':
/media/storage/Projects/build/Parusyncka/Debug/../../../Parusyncka/libldapcpp/include/LDAPException.h:23: undefined reference to `vtable for LDAPException'
userldapwriter.o:(.gcc_except_table+0x30): undefined reference to `typeinfo for LDAPException'
collect2: error: ld returned 1 exit status
make: *** [Parusyncka] Error 1
18:13:02: Процесс «/usr/bin/make» завершился с кодом 2.
Ошибка при сборке/установке проекта Parusyncka (комплект: Desktop)
Во время выполнения этапа «Сборка»
18:13:02: Прошло времени: 00:05.

C LIBS += "-Llibldapcpp/lib" тоже самое.

Ivan_qrt ★★★★★ ()
Ответ на: комментарий от nanoolinux

Попробуй без rpath.

Дурацкий совет - rpath вообще не влияет на линковку, только на конечный бинарник

annulen ★★★★★ ()
Ответ на: комментарий от annulen

Спасибо! Все заработало, более менее понял, что к чему.

Ivan_qrt ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.