Здравствуйте, qtprogger, Вы писали:
Q>Как собрать библиотеку libqlibrary.so так, чтобы при сборке некоторого не Qt приложения, использующего эту библиотеку, оно не требовало подключать заголовочные файлы Qt?
forward declaration и pimpl, или я чего-то не понимаю?
class QLibrary;
class MyLibrary {
public:
дублирование нужных методов из QLibrary
private:
std::unique_ptr<QLibrary> pimpl_;
};
Q>Если существуют решения какие-то подобной проблемы (Qt как библиотека для не Qt проекта), интересно было ознакомится с best practice.
В самом Qt полно использования pimpl для скрытия деталей реализации.
Как собрать библиотеку libqlibrary.so так, чтобы при сборке некоторого не Qt приложения, использующего эту библиотеку, оно не требовало подключать заголовочные файлы Qt?
Вот библиотечка, сгенерирована QTCreator.
$ cat qlibrary.h
#ifndef QLIBRARY_H
#define QLIBRARY_H
#include "qlibrary_global.h"
class QLIBRARYSHARED_EXPORT Qlibrary
{
public:
Qlibrary();
int getNumber() {return mNumber;}
private:
int mNumber {1};
};
#endif // QLIBRARY_H
$ cat qlibrary.cpp
#include "qlibrary.h"
Qlibrary::Qlibrary()
{
}
После сборки и установки библиотеки libqlibrary.so в системе хотелось бы в стороннем проекте при компиляции не таскать заголовочные файлы Qt:
$ cat main.cpp
#include <iostream>
#include "qlibrary.h"
int main()
{
Qlibrary q;
char ch = '';
while(ch != 'f')
{
std::cout << q.getNumber() << std::endl;
std::cout << "press key 'f' for finish\n";
std::cout << "key: ";
std::cin >> ch;
}
}
$ c++ main.cpp -lqlibrary
In file included from qlibrary.h:4:0,
from main.cpp:2:
qlibrary_global.h:4:10: fatal error: QtCore/qglobal.h: No such file or directory
#include <QtCore/qglobal.h>
^~~~~~~~~~~~~~~~~~
compilation terminated.
Какие последствия будут, если я удалю макрос QLIBRARYSHARED_EXPORT
#ifndef QLIBRARY_H
#define QLIBRARY_H
class Qlibrary
{
public:
Qlibrary();
int getNumber() {return mNumber;}
private:
int mNumber {1};
};
#endif // QLIBRARY_H
Если существуют решения какие-то подобной проблемы (Qt как библиотека для не Qt проекта), интересно было ознакомится с best practice.