3

我有一个用 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 的主模块中执行此操作,则链接器会抱怨 unresolved external gFmt128

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

4

4 回答 4

7

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

于 2008-09-18T10:21:36.983 回答
2

它们是否也在 .cpp 文件中定义?粗略地说,它应该如下所示:

struct Format
{
    [...]
    static Format gFmt128;
};
// Format.cpp
Format Format::gFmt128 = { 0, 128, 0 }
于 2008-09-18T10:18:04.043 回答
2

您需要将 Format 对象声明为extern而不是static

于 2008-09-18T10:18:39.300 回答
1

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

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

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

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

于 2008-09-18T18:29:57.450 回答