2016-05-31 6 views
0

Скажем, у меня есть 2 простых класса A и C, также у меня есть глобальные внешние переменные в виде указателей на A и C. Код:Как использовать общедоступные глобальные DLL-переменные?

//global.h 
#pragma once 
#include "A.h" 
#include "C.h" 
struct A; 
struct C; 
extern A* external_a; 
extern C* external_c; 
///////////////////////////////////////// 
//A.h 
#pragma once 
struct A { 
    void get(); 
}; 
/////////////////////////////////////////  
//A.cpp 
#include "A.h" 
void A::get() {} 
///////////////////////////////////////// 
//C.h 
#pragma once 
# include "global.h" 
struct C { 
    void doit(); 
}; 
///////////////////////////////////////// 
//C.cpp 
# include "C.h" 
void C::doit() { external_a->get(); } 
///////////////////////////////////////// 

Я перечислял только DLL-код. Дело было в том, что пользователь DLL должен предоставить (объявить) свой код EXE, скажем, глобальные переменные main.cpp для моего используемого DLL-кода. Таким образом, пользователь не находится в одном проекте, в то время как я хочу использовать внешние переменные в нескольких файлах внутри моего проекта DLL.

я получаю две ошибки из этого кода относительно unresolved external symbol "struct A * external_a" enter image description here

Я попытался написать __declspec(dllexport) в классе defenitions и после external ключевого слова. Это не помогает исправить ошибку. Поэтому я задаюсь вопросом, что делать, чтобы составить такой проект?

+0

Что присутствует внутри "хиджры". Если у вас определена A * external_a, ее следует сначала объявить с использованием ключевого слова extern. – Sumeet

+1

Я не вижу, где определены 'external_a' и' external_c'. –

+0

Вы пытались использовать очевидный 'extern __declspec (dllimport) A * external_a;' и '__declspec (dllexport) A * external_a;' в DLL? («очевидным» я имею в виду «очевидное, если вы уже знаете, как экспортировать функции) – immibis

ответ

1

Сообщение об ошибке ясно и не имеет никакого отношения к DLL или DLL-импорту/экспорту. Вы объявили «внешняя связь»extern A* external_a;, но внешняя связь с чем?

В одном из ваших * .cpp-файлов (как правило, содержащих основную точку входа) должно быть объявление глобальной переменной. Если вы используете указатель, вы также должны выделить его. Например

Файл "main.cpp"

#include "a.h" 

//Initialize pointer here: 
MyStructA* global_a; 
int main() 
{ 
    //Allocate data here 
    //(unless this is a DLL project and you are passing a variable) 
    global_a = new MyStructA; 
    foo(); 
    return 0; 
} 

(я изменил имя переменной global_a, что делает больше смысла)

Если вы хотите использовать global_a в другом файле в же проекта, используйте extern MyStructA* global_a;. Например, в "otherfile.cpp"

#include "a.h" 

extern MyStructA* global_a; 
foo(); 
... 


Если у вас есть проект EXE, и отдельный проект DLL, а затем использовать dllexport/dllimport для доступа функции в DLL. Объявите данные в проекте EXE, затем используйте функции для передачи данных. extern в данном случае не имеет значения. Например:

Использование dllexport В проекте DLL:

MyStructA *global_a; 

__declspec(dllexport) void foo(MyStructA *p) 
{ 
    global_a = p; 
} 

dllimport Использование в проекте EXE:

__declspec(dllimport) void foo(MyStructA *p); 

MyStructA A; 
foo(&A); 
+0

Я перечислил только DLL-код. Дело было в том, что пользователь DLL должен был предоставить из своего основного словаря.глобальные переменные cpp для использования моего кода. Таким образом, пользователь не находится в одном проекте. Хотя я хочу использовать эти внешние переменные в нескольких файлах внутри моего проекта DLL – DuckQueen

+0

Я объяснил им обоим. Вы должны разобраться в этом отдельно. Напишите простой тестовый проект для 'extern', напишите еще один тестовый проект для DLL, а затем соедините их, если необходимо. –

+0

Речь идет не о том, чтобы иметь их sepratly. Речь идет о предоставлении экземпляра глобальной переменной в Dll из внешнего EXE, w2hile с использованием этой глобальной переменной внутри exe – DuckQueen

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