2008-09-18 54 views
3

我已经静态库用C++编写,我有一个结构描述数据格式,即
从C++静态库导出变量

struct Format{ 
    long fmtId; 
    long dataChunkSize; 
    long headerSize; 

    Format(long, long, long); 

    bool operator==(Format const & other) const; 
}; 

一些数据格式被广泛使用,像{fmtId=0, dataChunkSize=128, headerSize=0}{fmtId=0, dataChunkSize=256, headerSize=0}

一些数据结构类在构造函数中接收格式。我想为这些广泛使用的格式提供某种快捷方式,例如我可以通过引用传递的几个全球Format成员gFmt128, gFmt256。我实例他们在一个.cpp文件一样

Format gFmt128(0, 128, 0);

和.H有

extern Format gFmt128;

还,我宣告Format const & Format::Fmt128(){return gFmt128;},并尝试在主模块中使用它。

但是,如果我尝试做一个使用的lib在主模块中,链接器抱怨无法解析的外部gFmt128

我怎样才能让我的图书馆“出口”的全局变量,这样我就可以从其他模块使用它们?

回答

2

他们是在.cpp文件中定义的呢?粗略地说,它应该看起来像:

struct Format 
{ 
    [...] 
    static Format gFmt128; 
}; 
// Format.cpp 
Format Format::gFmt128 = { 0, 128, 0 } 
+0

这似乎是一个C++对象的正确方法。这里的静态使结构成员gFmt128成为一个类变量而不是具有内部连接的全局变量。 – workmad3 2008-09-18 10:32:42

2

您需要声明的格式对象作为的extern没有静态

1

Morhveus,我想这一点,太。 我的链接器宁可说它已经定义了gFmt128符号。这确实是我期望的行为:编译器将函数体添加到库和客户端对象,因为它在include文件中定义。

我得到无法解析的外部的唯一途径是通过

  • 不添加静态库的对象将要联
  • 静态库的源文件中没有定义符号gFmt128

我疑惑......为什么我们看到不同的东西?你能解释发生了什么?

+0

我必须疯狂。 Skizz的答案似乎是解释发生了什么。 – user17481 2008-09-19 08:26:09