我做了一个测试来检查共享库中的单例是否真的是唯一的。项目架构看起来像这样
+----------+main+-----------+
| + |
| | |
v v v
plugin dynamicLib staticLib
(dynamicLib) ^ ^
+ | |
| | |
+-------------+-------------+
staticLib和dynamicLib有一个单instance
个getter和函数func
,它只打印实例地址和名称。插件还有一个函数func
,它获取库的单例实例并在它们上调用func
。最后,main只调用所有三个func
。令我惊讶的是输出结果是:
0x105bc20 Dynamic::func
0x105c050 Static::func
Now calling plugin...
Plugin: Calling libs ...
-------
0x105bc20 Dynamic::func
0x105c050 Static::func
-------
好的动态库中的单例显然总是独一无二的,但为什么静态库实例也是唯一的呢?我使用g ++(GCC)6.1.1在linux上编译了这个。这种标准行为在win / osx上是不同的? 你能否解释为什么静态libs实例是唯一的以及如何实现这一点。 Afaik符号应该在两个编译单元中定义。使用在getter中使用局部静态的maiers singleton是否起作用?