从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
我很困惑...我们怎么会看到不同的东西?你能解释会发生什么吗?