从C ++静态库导出变量

时间:2008-09-18 10:14:58

标签: c++ export

我有一个用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

如何让我的库'导出'那些全局变量,所以我可以在其他模块中使用它们?

4 个答案:

答案 0 :(得分:7)

不要在全局声明中使用static关键字。 Here is an article explain the visibility of variables with/without static。静态赋予全局变量内部链接,即只在声明它们的翻译单元中可见。

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

您需要将格式对象声明为 extern 而非静态

答案 3 :(得分:1)

Morhveus,我也试过这个。 我的链接器说它已经定义了gFmt128符号。这确实是我期望的行为:编译器将函数体添加到库和客户端对象,因为它是在包含文件中定义的。

我得到未解决的外部的唯一方法是

  • 未将静态库添加到要链接的对象
  • 未在静态库的源文件中定义符号gFmt128

我很困惑......为什么我们会看到不同的东西?你能解释一下会发生什么吗?