我正在尝试在一个大型系统上编译其他人的包装器程序,其中它使用来自另一个文件的全局对象,该类的定义如下:
class __declspec(dllexport) A
{
...
static A * instance;
}
在我单独的源文件(我想构建为.exe)中,我包含了头文件A.h,并在开头声明如下
A * A::instance;
访问A中的数据。
问题是,这段代码可以在Linux上成功构建,现在当我尝试在Windows NT中构建它时,它会有问题。
如果我这样离开,编译器会抱怨C2491 error, definition of dllimport function not allowed
。
如果我删除这行A声明,我会收到很多错误LNK2001: unresolved external symbol
。
不太清楚这里有什么问题,我在网上做了一些研究,但找不到一个好的答案,我自己也不熟悉dll导入/导出和一些C ++技巧。有人可以提供一些问题的见解,或者我应该花时间去解决这个问题吗?
或者说,如果我已经有这样的静态对象,并且我想编写另一个程序来访问它,我该怎么做?
如果我在这里犯了任何错误,请纠正我。谢谢!
答案 0 :(得分:1)
我认为您需要的关键字为extern
,如:
extern A *A::instance;
这表示变量A::instance
是在其他地方定义的,但是你告诉编译器它,所以你可以在这个文件中按名称使用它。
答案 1 :(得分:0)
__ declspec(dllexport)。只要您没有从另一个DLL调用该类,就没有必要这样做。
但我怀疑你的问题与使用.c文件而不是类规范有关。试着读一下这个。它讨论了dllexport的详细信息Windows & C++: extern & __declspec(dllimport)
答案 2 :(得分:0)
Singleton通常有一个函数,比如
A::instance = NULL;
A * get_instance() {if (!A::instance) A::instance = new A; return A::instance;}
如果你有这样的函数,你不必直接访问A :: instance。
抱歉,你在做什么?在C程序中包含C ++头?它甚至可以编译吗?
答案 3 :(得分:0)
我个人通常会在匿名命名空间中隐藏.cpp文件中的实例。然后我提供了一个getInstance()函数,它返回一个指针或对它的引用,我dllExport该函数。
如果你想强制执行一些事情,你可以为A private构建一个构造函数,并使getInstance成为朋友。