C ++静态类成员未在*静态库中初始化*

时间:2017-03-01 20:26:06

标签: c++ static static-libraries

我目前面临着一个令人烦恼的C ++问题。

实际上,我甚至不理解为什么在过去的20年里我没有面对它:(

在我目前的背景下,我们大量使用c ++可执行文件(主要是在Linux嵌入式系统中)静态与我们专有的静态库链接。 出于技术和优化的原因,我们确实使用静态库。

在过去的几年中,我确实曾经创建了共享库...

所以我开始用静态类成员编写一些类。如下:

class Inner
{
public:
   Inner()
   {
     std::cout << "CTOR Inner" << std::endl;
   }
};

class A
{
static Inner _inner;

...
};

// in the .cpp

Inner A::_inner;

///////////////////////

非常基本的用例,不是吗?

但在我的单元测试中,与lib链接,我无法在控制台中看到std::cout语句。 然而,如果我将我的类Inner和A移动到可执行的源代码中......它可以正常工作。

我确定这是一个非常基本的问题,我意识到过去几年我从未面对过这个问题。 这是与编译器有关的问题吗? 请注意,我在Windows和Linux上测试了这两种情况(Debian,Gcc 4.9)。

欢迎任何想法。

Ž。

1 个答案:

答案 0 :(得分:7)

你必须以某种方式实际使用A :: _ inner或者不包括那部分代码。要么是那个,要么在该文件中使用其他东西。链接器不必链接从未使用过的翻译单元,即使它们具有可观察到的副作用。

How to force inclusion of "unused" object definitions in a library