2013-03-04 3 views
1

Я не могу экспортировать массив из DLL. Вот мой код:Как экспортировать массив из DLL?

"DLL заголовок"

#ifdef EXPORT 
    #define MYLIB __declspec(dllexport) 
#else 
    #define MYLIB 
#endif 


extern "C" { 
/* Allows to use file both with Visual studio and with Qt*/ 
#ifdef __cplusplus 
    MYLIB double MySum(double num1, double num2); 
    extern MYLIB char ImplicitDLLName[]; 
#else 
    extern Q_DECL_IMPORT char ImplicitDLLName[]; 
    Q_DECL_IMPORT double MySum(double num1, double num2); 
#endif 
} 

"источник DLL"

#define EXPORT 
    #include "MySUMoperator.h" 

    double MySum(double num1, double num2) 
    { 
     return num1 + num2; 
    } 

    char ImplicitDLLName[] = "MySUMOperator"; 

"клиент main.cpp"

int main(int argc, char** argv) 
{ 
    printf("%s", ImplicitDLLName); 
} 

Строя я получаю от линкера этой ошибки:

Error 2 error LNK2001: unresolved external symbol _ImplicitDLLName \Client\main.obj 

// Моей целью экспорта массива является изучение экспорта различных структур данных из библиотеки DLL

Как справиться с ошибка, поднятая компоновщиком и какие правила нарушены?

* UPDATE: * IDE Visual Studio 2010.
Client - написана на C++, а также DLL на C++

+0

Я думаю, вам нужно поставить MYLIB в массиве * определение *. –

+0

@ н.м. После того, как вы предложили - я пробовал, он не работает –

ответ

3

Предполагая, что вы связываете вашу библиотеку импорта правильно (и то будет большой предположение), вы не правильно объявить MYLIB для импортирующих символов:

Это:

#ifdef EXPORT 
    #define MYLIB __declspec(dllexport) 
#else 
    #define MYLIB 
#endif 

Должно быть так:

#ifdef EXPORT 
    #define MYLIB __declspec(dllexport) 
#else 
    #define MYLIB __declspec(dllimport) 
#endif 

Имейте в виду, мы в небольшой контекст для работы. Он выглядит, как будто вы пытаетесь использовать это из С-скомпилированного приложения, но без дополнительной информации я не могу быть уверен. Если это так, то Q_DECL_IMPORT лучше сделать выше, или он все равно не будет работать. Я начну с базового экспорта ссылок «С» и проделаю свой путь оттуда.


Образец EXPORTS.DLL

Exports.h

#ifdef EXPORTS_EXPORTS 
#define EXPORTS_API __declspec(dllexport) 
#else 
#define EXPORTS_API __declspec(dllimport) 
#endif 

extern "C" EXPORTS_API char szExported[]; 

Exports.cpp

#include "stdafx.h" 
#include "Exports.h" 

// This is an example of an exported variable 
EXPORTS_API char szExported[] = "Exported from our DLL"; 

Образец EXPORTSCLIENT.EXE

ExportsClient.каст

#include "stdafx.h" 
#include <iostream> 
#include "Exports.h" 
using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    cout << szExported << endl; 
    return 0; 
} 

Выход

Exported from our DLL 
+0

Спасибо за ответ. Я также получил функции в своей DLL, и они успешно экспортированы, поэтому я могу использовать их у клиента. Чтобы проверить, экспортирован ли массив, я использую dumpbin/exports mydllName.dll, и он говорит, что массив экспортируется. Насколько я знаю, оператор __declspec (dllimport) является необязательным и может быть исключен. –

+0

@spin_eight Я пробовал компиляцию без него в прошлом и без радости по внешним * переменным * по моему опыту. Компиляция вышеприведенного образца без dllimport specc'ed Я получаю ту же неопределенную ссылку в вашем вопросе. Поэтому я всегда использую его. Также возможно, что проблема с вашей стороны может быть проблемой связи с «С». Я тоже посмотрю на это. – WhozCraig

+0

Большое спасибо, дело в том, что я пропустил __declspec (dllimport) в заголовке клиентов. При отладке моего кода я не хотел пытаться вставить заявление __declspec (dllimport) из-за того, что мой преподаватель университета настаивал на том, что это заявление является необязательным и предназначено только для облегчения работы линкеров. Поэтому с этого момента я буду дважды проверять заявления учителей. Существуют ли какие-либо dll-стандарты, поэтому на самом деле, где я могу найти информацию, что __declspec (dllimport) является обязательным, как вы это поняли ??? –

 Смежные вопросы

  • Нет связанных вопросов^_^