[Решено] Qt и динамические библиотеки (*.so, *.dll)

Модератор: Модераторы разделов

MrSinister
Сообщения: 95

[Решено] Qt и динамические библиотеки

Сообщение MrSinister »

Собственно, никак не могу разобраться, как создать и использовать простую динамическую библиотеку (классов).
Допустим, работаю в Qt Creator. Есть проект qLibEx, то есть сама библиотека классов. При создании по шаблону lib описан класс QLibEx. Ну это не столь важно.
Создаю ещё один класс QLibExDD и реализую его одну функцию.

qLibEx.pro

Код:

QT -= gui TARGET = qLibEx TEMPLATE = lib DEFINES += QLIBEX_LIBRARY SOURCES += qlibex.cpp \ qlibexdd.cpp HEADERS += qlibex.h \ qLibEx_global.h \ qlibexdd.h


qLibEx_global.h

Код:

#ifndef QLIBEX_GLOBAL_H #define QLIBEX_GLOBAL_H #include <QtCore/qglobal.h> #if defined(QLIBEX_LIBRARY) # define QLIBEXSHARED_EXPORT Q_DECL_EXPORT #else # define QLIBEXSHARED_EXPORT Q_DECL_IMPORT #endif #endif // QLIBEX_GLOBAL_H


qlibex.h

Код:

#ifndef QLIBEX_H #define QLIBEX_H #include "qLibEx_global.h" class QLIBEXSHARED_EXPORT QLibEx { public: QLibEx() { } }; #endif // QLIBEX_H


qlibexdd.h

Код:

#ifndef QLIBEXDD_H #define QLIBEXDD_H #include "qLibEx_global.h" #include <iostream> class QLIBEXSHARED_EXPORT QLibExDD { public: QLibExDD(); void showf(); }; #endif // QLIBEXDD_H


qlibexdd.cpp

Код:

#include "qlibexdd.h" QLibExDD::QLibExDD() { } void QLibExDD::showf() { std::cout << "FUCKFUCKFUCK" << std::endl; }


Создаю ещё один проект, который использует эту библиотеку.
Бросаю скомпилированную libqLibEx.so.1.0.0 и все её симлинки в дирректорию с проектом.

qtestLib.pro

Код:

QT -= gui TARGET = qtestLib CONFIG += console CONFIG -= app_bundle LIBS += -llibqLibEx INCLUDEPATH += . TEMPLATE = app SOURCES += main.cpp


main.cpp

Код:

#include <QtCore/QCoreApplication> #include <qlibex.h> #include <qlibexdd.h> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QLibExDD s; s.showf(); return a.exec(); }


Не совсем понятно, что именно писать в .pro в секции LIBS. Линкер ругается:

Код: Выделить всё

Running build steps for project qtestLib...
Starting: /usr/bin/make clean -w
make: Entering directory `/home/skywarp/src/workspace_cpp/qtestLib'
rm -f main.o
rm -f *~ core *.core
make: Leaving directory `/home/skywarp/src/workspace_cpp/qtestLib'
Exited with code 0.
Configuration unchanged, skipping QMake step.
Starting: /usr/bin/make -w
make: Entering directory `/home/skywarp/src/workspace_cpp/qtestLib'
g++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4 -I. -I. -o main.o main.cpp
g++ -Wl,-rpath,/usr/lib64/qt4 -o qtestLib main.o -L/usr/lib64/qt4 -llibqLibEx -lQtCore -L/usr/lib64 -L/usr/lib64/qt4 -lz -lm -pthread -lgthread-2.0 -lrt -lglib-2.0 -ldl -lpthread
/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -llibqLibEx
collect2: ld returned 1 exit status
make: *** [qtestLib] Error 1
make: Leaving directory `/home/skywarp/src/workspace_cpp/qtestLib'
Exited with code 2.
Error while building project qtestLib
When executing build step 'Make'


В книгах по Qt читал, там ещё пишут про extern "C", как использовать это с классами? Дальше там идёт про плагины, а про либы так и не раскрыто полностью. Метод с QLibrary не особо хочется использовать. Библиотеки ни разу не создавал ещё.

p.s.: жаль тут нет тега, который свёртывает содержимое.
Спасибо сказали:
Аватара пользователя
TuxWare
Сообщения: 637
ОС: Windows 7

Re: [Решено] Qt и динамические библиотеки

Сообщение TuxWare »

В qtestlib.pro добавьте
QMAKE_LFLAGS = -Wl,-rpath -Wl,/home/и_тд_путь_к_каталогу_где_лежит_библиотека
Можно абсолютно. Можно относительно.

Пардон. Исправил.
Спасибо сказали:
MrSinister
Сообщения: 95

Re: [Решено] Qt и динамические библиотеки

Сообщение MrSinister »

Спасибо за наводку. Получилось с изменением этих строчек:

Код: Выделить всё

LIBS += libqLibEx.so
INCLUDEPATH += /home/skywarp/src/workspace_cpp/qtestLib
QMAKE_LFLAGS += -Wl,-rpath -Wl, ./libqLibEx.so


Но теперь возникает проблема, если компилировать под другую систему, придётся изменять .pro файл. Нет какого-нибудь кроссплатформенного способа?
Если не указывать расширение .so, то ругается опять же.
Спасибо сказали:
Аватара пользователя
TuxWare
Сообщения: 637
ОС: Windows 7

Re: [Решено] Qt и динамические библиотеки

Сообщение TuxWare »

Ну например
win32 {
LIBS += libqLibEx.dll
} else {
LIBS += libqLibEx.so
}
А вообще в справке по Qt все это описано. Я лично в упор не представляю как работает линкер на винде и поддерживает ли он опцию -r.
Спасибо сказали: