Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Библиотеки .so/.dll - макрос MYLIBSHARED_EXPORT 
:(
    Опции темы
math64
Дата 11.4.2011, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Создал в Qt Creator проект библиотеки .dll/.so
Создается класс:
Код

#include "mylib_global.h"
class MYLIBSHARED_EXPORT MyLib {
public:
  MyLib();
};

Когда нужно использовать макрос MYLIBSHARED_EXPORT?
При использовании gcc в Windows и Linux вроде бы всё работает и без него.

PM   Вверх
borisbn
Дата 11.4.2011, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(math64 @  11.4.2011,  09:52 Найти цитируемый пост)
При использовании gcc в Windows и Linux вроде бы всё работает и без него.

во первых, поделись, как у тебя gcc работает в Windows ?
во вторых, что ты подразумеваешь под "всё работает" ?

посмотри в mylib_global.h как этот дефайн описан. будет непонятно - спрашивай


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
math64
Дата 11.4.2011, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



В Windows gcc ставится вместе с Qt (MinGW)
Код

#ifndef MYLIB_GLOBAL_H
#define MYLIB_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(MYLIB_LIBRARY)
#  define MYLIBSHARED_EXPORT Q_DECL_EXPORT
#else
#  define MYLIBSHARED_EXPORT Q_DECL_IMPORT
#endif

#endif // MYLIB_GLOBAL_H

т.е. при компиляции библиотеки это Q_DECL_EXPORT, при компиляции приложения Q_DECL_IMPORT:
Код

#ifndef Q_DECL_EXPORT
#  if defined(Q_OS_WIN) || defined(Q_CC_NOKIAX86) || defined(Q_CC_RVCT)
#    define Q_DECL_EXPORT __declspec(dllexport)
#  elif defined(QT_VISIBILITY_AVAILABLE)
#    define Q_DECL_EXPORT __attribute__((visibility("default")))
#  endif
#  ifndef Q_DECL_EXPORT
#    define Q_DECL_EXPORT
#  endif
#endif
#ifndef Q_DECL_IMPORT
#  if defined(Q_OS_WIN) || defined(Q_CC_NOKIAX86) || defined(Q_CC_RVCT)
#    define Q_DECL_IMPORT __declspec(dllimport)
#  else
#    define Q_DECL_IMPORT
#  endif
#endif

меня особо интересует его использование в шаблонах, нужен ли он здесь:
Код

//class T производный от QGraphicsItem, который может быть определён в Qt, mylib или myapp
template <class T> class ItemFactory {
QGraphicsItem* create(QGraphicsScene *scene, const QPointF &point);
};


PM   Вверх
borisbn
Дата 11.4.2011, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(math64 @  11.4.2011,  10:55 Найти цитируемый пост)
В Windows gcc ставится вместе с Qt (MinGW)

gcc != MinGW. У них хоть и общий корень, но это разные компиляторы

Цитата(math64 @  11.4.2011,  10:55 Найти цитируемый пост)
т.е. при компиляции библиотеки это Q_DECL_EXPORT, при компиляции приложения Q_DECL_IMPORT:

 smile 

Цитата(math64 @  11.4.2011,  10:55 Найти цитируемый пост)
меня особо интересует его использование в шаблонах, нужен ли он здесь:

совершенно не нужен. этот макрос - фактически указание линковщику, а все шаблонные вещи существуют только на этапе компиляции


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
math64
Дата 11.4.2011, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Это только шаблонная inline-функция существует только на этапе компиляции, и то если компилятор не посчитает сделать из неё обычную функцию.
При реализации шаблонного класса создается реальный класс (например, ItemFactory<QGraphicsLineItem>), реализованный либо в библиотеке, либо в приложении.
Код

template<>
QGraphicsItem* ItemFactory<QGraphicsLineItem>::create(QGraphicsScene *scene, const QPointF &point)
{
    qreal x1 = point.x();
    qreal y1 = point.y();
    qreal x2 = x1 + dx;
    qreal y2 = y1 + dy;
    QGraphicsLineItem* line = scene->addLine(x1, y1, x2, y2, pen);
    return line;
}

При неправильном шаблоне могут создаться две копии класса, в приложении и в библиотеке.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0808 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.