假设我有2个简单的类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"
的两个错误
我曾尝试在课堂辩护中和__declspec(dllexport)
关键字后写external
。它无法解决错误。所以我想知道如何能够编译这样的项目?
答案 0 :(得分: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
在这种情况下无关紧要。例如:
在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);