如何使用公开导出的全局 DLL 变量?
How to use publically exported global DLL variables?
假设我有 2 个简单的 classes A
和 C
,我还有指向 A
和 C
的指针形式的全局外部变量.代码:
//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"
我从这段代码中得到两个错误
我尝试在 class 定义中和 external
关键字之后写 __declspec(dllexport)
。它无助于修复错误。所以我想知道应该怎么做才能编译这样的项目?
错误信息很清楚,与DLL或DLL无关import/export。您已声明 "external linkage" 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 中的 functions。在 EXE 项目中声明数据,然后使用函数传递数据。 extern
在这种情况下不相关。例如:
在 DLL 项目中使用 dllexport
:
MyStructA *global_a;
__declspec(dllexport) void foo(MyStructA *p)
{
global_a = p;
}
在 EXE 项目中使用 dllimport
:
__declspec(dllimport) void foo(MyStructA *p);
MyStructA A;
foo(&A);
假设我有 2 个简单的 classes A
和 C
,我还有指向 A
和 C
的指针形式的全局外部变量.代码:
//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"
我从这段代码中得到两个错误
我尝试在 class 定义中和 external
关键字之后写 __declspec(dllexport)
。它无助于修复错误。所以我想知道应该怎么做才能编译这样的项目?
错误信息很清楚,与DLL或DLL无关import/export。您已声明 "external linkage" 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 中的 functions。在 EXE 项目中声明数据,然后使用函数传递数据。 extern
在这种情况下不相关。例如:
在 DLL 项目中使用 dllexport
:
MyStructA *global_a;
__declspec(dllexport) void foo(MyStructA *p)
{
global_a = p;
}
在 EXE 项目中使用 dllimport
:
__declspec(dllimport) void foo(MyStructA *p);
MyStructA A;
foo(&A);