Russian Qt Forum
Сентябрь 29, 2024, 12:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Как сделать DLL  (Прочитано 15874 раз)
BaltikS
Гость
« Ответ #15 : Октябрь 27, 2006, 17:18 »

Такое  ощущение, что ты к проекту LIB забыл подключить....
Записан
Lion
Гость
« Ответ #16 : Октябрь 28, 2006, 09:51 »

Цитата: "BaltikS"
Такое  ощущение, что ты к проекту LIB забыл подключить....

Никакого lib не появилось. Как его подключить?
Записан
Dendy
Гость
« Ответ #17 : Октябрь 28, 2006, 13:12 »

Рядом с myapp.dll создаётся myapp.lib, но только если у тебя експортится из DLL хотя-бьІ один символ.

Смотри мой пост ранее. Класс експортится примерно таким способом:

Код:
#if defined Q_WS_WIN 
#   ifdef MYWIDGET_STATIC
#      define MYWIDGET_EXPORT
#   else
#      ifdef MYWIDGET_BUILD
#         define MYWIDGET_EXPORT __declspec(dllexport)
#      else
#         define MYWIDGET_EXPORT __declspec(dllimport)
#      endif
#   endif
#else
#   define MYWIDGET_EXPORT
#endif

class MYWIDGET_EXPORT MyWidget : public QWidget
...


При етом в файле проекта, которьІй создаёт DLL должен стоять макрос DEFINES += MYWIDGET_BUILD, что означает применение к данному классу експортирования: MYWIDGET_EXPORT == __declspec(dllexport).

В файле проекта программьІ, в которой тьІ используешь оную DLL не ставишь никаких макросов. Ето приводит к тому, что заголовочник для компиллятора будет вьІглядеть по-другому. А именно: MYWIDGET_EXPORT == __declspec(dllimport). В результате линковщик будет импортировать етот класс.
Записан
crocus
Гость
« Ответ #18 : Октябрь 28, 2006, 14:30 »

А порекомендуй, где про это можно почитать, для систематизированного понимания??
Записан
Dendy
Гость
« Ответ #19 : Октябрь 28, 2006, 14:38 »

Для виндьІ В MSDN наверное Подмигивающий  Да и просматривать исходники Qt никогда не мешает.
Записан
Lion
Гость
« Ответ #20 : Октябрь 28, 2006, 15:25 »

Всё сделал как написано, только либ не увидел. Теперь
её подключил, все классы линкуются а отдельные функции нет. Делаю так:
Код:

UTILS_EXPORT int SHA1Hash(SHA1Context *, const unsigned char *, unsigned);


где UTILS_EXPORT = MYWIDGET_EXPORT
Записан
Вячеслав
Гость
« Ответ #21 : Октябрь 28, 2006, 16:40 »

Цитата: "Lion"
Всё сделал как написано, только либ не увидел. Теперь
её подключил, все классы линкуются а отдельные функции нет. Делаю так:
Код:

UTILS_EXPORT int SHA1Hash(SHA1Context *, const unsigned char *, unsigned);


где UTILS_EXPORT = MYWIDGET_EXPORT

Функция не из C-linkage случаем ?
i.e. extern "C" не надо ?
Код:

extern "C" UTILS_EXPORT int SHA1Hash(SHA1Context *, const unsigned char *, unsigned);
Записан
Lion
Гость
« Ответ #22 : Октябрь 28, 2006, 21:23 »

Для полной ясности привожу исходные коды
Код:
#ifndef UTILS_EXPORT

# if defined Q_WS_WIN
#   ifdef UTILS_STATIC
#     define UTILS_EXPORT  //Static link
#   else
#     ifdef UTILS_DLL
#       define UTILS_EXPORT __declspec(dllexport)  //Dynamic link
#     else
#       define UTILS_EXPORT __declspec(dllimport)  //Import from dll
#     endif
#   endif
# else
#   define UTILS_EXPORT  //Linux
# endif


#endif //UTILSEXPORT_H


Код:
#ifndef _SHA1_H_
#define _SHA1_H_

#include "utilsexport.h"

/*
 *  This structure will hold context information for the hashing
 *  operation
 */
typedef struct SHA1Context
{
    unsigned Message_Digest[5]; /* Message Digest (output)          */

    unsigned Length_Low;        /* Message length in bits           */
    unsigned Length_High;       /* Message length in bits           */

    unsigned char Message_Block[64]; /* 512-bit message blocks      */
    int Message_Block_Index;    /* Index into message block array   */

    int Computed;               /* Is the digest computed?          */
    int Corrupted;              /* Is the message digest corruped?  */
} SHA1Context;

#ifdef __cplusplus
extern "C" {
#endif

/*
 *  Function Prototypes
 */

UTILS_EXPORT void SHA1Reset(SHA1Context *);
UTILS_EXPORT void SHA1Input(SHA1Context *, const unsigned char *, unsigned);
UTILS_EXPORT int SHA1Result(SHA1Context *);
UTILS_EXPORT int SHA1Hash(SHA1Context *, const unsigned char *, unsigned);
UTILS_EXPORT int SHA1Hex(const SHA1Context *context, char *hex);

#ifdef __cplusplus
}
#endif

#endif


добавлено спустя 7 минут:

 Для проекта библиотеки определено UTILS_DLL
Записан
Dendy
Гость
« Ответ #23 : Октябрь 28, 2006, 21:58 »

А реализации етих не-линкующихся функций присутствуют? Уверен, что не ошибся ни в одной букве функции в CPP-файле? Компиллятор ведь промолчит.

Кроме того, всегда можно посмотреть что експортится сторонними утилитами.
Записан
Lion
Гость
« Ответ #24 : Октябрь 28, 2006, 22:22 »

До этого все успешно линковалось статически
Записан
Lion
Гость
« Ответ #25 : Ноябрь 03, 2006, 21:10 »

Как всегда всё оказалось проще чем казалось, просто Q_WS_WIN определяется в qglobal.h, а в моем случае макрос инклудился вперед всех qt -шных модулей. #include <QObject> в макросе решило все проблемы.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 21.