我目前面临着一个令人烦恼的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)。
欢迎任何想法。
Ž。
答案 0 :(得分:7)
你必须以某种方式实际使用A :: _ inner或者不包括那部分代码。要么是那个,要么在该文件中使用其他东西。链接器不必链接从未使用过的翻译单元,即使它们具有可观察到的副作用。
How to force inclusion of "unused" object definitions in a library