使用全局变量创建共享库

时间:2015-07-23 21:09:40

标签: c++ dll g++ shared-libraries

在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 ,还是必须将全局变量放在全局命名空间的共享库中?

0 个答案:

没有答案