在Windows下的g ++编译器上下文中询问此问题。
我想说我想创建一个共享库MyLibrary.dll。
MyLibrary.h:
#ifndef _MYLIBRARY_H
#define _MYLIBRARY_H
#ifdef MYLIBRARY_DLL_EXPORT
#define MYLIBRARY_API __declspec(dllexport)
#else
#define MYLIBRARY_API __declspec(dllimport)
#endif
class MYLIBRARY_API XYZ{
public:
double x;
};
MYLIBRARY_API extern XYZ xyz; // Is this correct, I just want to declare, hence "extern"
#endif
MyLibrary.cpp:
#include "MyLibrary.h"
XYZ xyz; // DEFINITION OF xyz
然后我将其编译成两个文件,
MyLibrary.dll
libMyLibrary.a
现在,假设我想在程序中使用变量 xyz ,我只链接到导入库(即使用-lMyLibrary),当然还包括标题MyLibrary.h。 p>
我编译时似乎得到了一个未定义的引用。
undefined reference to `__imp__ZN2VX6................
如何定义"全球"共享库中的变量,即存在于一个副本中并且可以在线程之间共享的变量吗?
修改
我发现原因是我在MyLibrary.h中的两个命名空间中声明了我的变量 xyz 。当我将变量移到命名空间A和B之外(即进入全局命名空间)时,它就起作用了。
我有这个:
MyLibrary.h:
#ifndef _MYLIBRARY_H
#define _MYLIBRARY_H
#ifdef MYLIBRARY_DLL_EXPORT
#define MYLIBRARY_API __declspec(dllexport)
#else
#define MYLIBRARY_API __declspec(dllimport)
#endif
namespace A{
namespace B{
class MYLIBRARY_API XYZ{
public:
double x;
};
MYLIBRARY_API extern XYZ xyz; // Is this correct, I just want to declare, hence "extern"
} // B
} // A
#endif
MyLibrary.cpp:
#include "MyLibrary.h"
A::B::XYZ xyz; // DEFINITION OF xyz
然后我尝试在MyLibrary之外使用xyz,将其称为
A::B::xyz
问题: 我是否以错误的方式引用 xyz ,还是必须将全局变量放在全局命名空间的共享库中?