从C ++静态库导出变量

时间:2020-03-06 14:20:42  来源:igfitidea点击:

我有一个用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文件中实例化它们,例如

格式化gFmt128(0,128,0);

在.h中

extern格式gFmt128;

同样,我声明Format const&Format :: Fmt128(){return gFmt128;}并尝试在主模块中使用它。

但是,如果我尝试在使用lib的主模块中执行此操作,则链接器会抱怨未解析的外部gFmt128

如何使我的库"导出"这些全局变量,以便可以从其他模块中使用它们?

解决方案

它们也在.cpp文件中定义吗?大致来说,它应该像这样:

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

我们需要将Format对象声明为extern不是静态的

不要在全局声明中使用static关键字。这是一篇文章,说明带/不带静态变量的可见性。静态变量提供了全局变量的内部链接,即,仅在声明它们的翻译单元中可见。

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

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

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

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