我有一个用 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
。
如何让我的库“导出”这些全局变量,以便我可以从其他模块使用它们?
不要在全局声明中使用 static 关键字。 这里有一篇文章解释了带/不带静态变量的可见性。静态提供全局内部链接,即仅在声明它们的翻译单元中可见。
它们也在 .cpp 文件中定义吗?粗略地说,它应该看起来像:
struct Format
{
[...]
static Format gFmt128;
};
// Format.cpp
Format Format::gFmt128 = { 0, 128, 0 }
您需要将 Format 对象声明为 extern 而不是 static
Morhveus,我也尝试过这个。 My 链接器更确切地说它已经定义了 gFmt128 符号。这确实是我期望的行为:编译器将函数体添加到库和客户端对象中,因为它是在包含文件中定义的。
我获得未解决的外部问题的唯一方法是
我很困惑...为什么我们看到的东西不一样?你能解释一下发生了什么吗?
爱你))) 喜欢听,我希望你喜欢))))
https://open.spotify.com/playlist/1LliyVMqm10tTdcSiTgcnF?si=aa952eaf20804684