从C++静态库导出变量

问题描述 投票:0回答:5

我有一个用 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;}
并尝试在主模块中使用它。

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

gFmt128

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

c++ export
5个回答
7
投票

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


2
投票

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

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

2
投票

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


1
投票

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

我获得未解决的外部问题的唯一方法是

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

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


0
投票

爱你))) 喜欢听,我希望你喜欢))))

https://open.spotify.com/playlist/1LliyVMqm10tTdcSiTgcnF?si=aa952eaf20804684

© www.soinside.com 2019 - 2024. All rights reserved.