这里我有一个非常简单的Point类:
namespace wtf{
template<typename T> class Point{
public:
T x;
T y;
Point(T xx, T yy): x(xx), y(yy) {};
};
}
作为模板类,我的理解是不能像往常一样单独使用标题/实现文件。
如果我命名包含此类Point.cpp
的文件,并将其编译为共享库,如下所示,则文件大小为5.6K,这似乎是合理的。但是,如果我将文件重命名为Point.hpp
(或.hxx
或.h++
),则文件大小会增加到1.9M!显然gcc
正在以不同方式处理这两种文件类型!
在我将其剥离到MWE之前,还有其他标准的lib包括(sstream
和iostream
),这使文件大小达到了11M!这也可能会给出一些关于发生了什么的线索,但是......
我很好奇这里发生了什么,以及gcc
是否有其他方式可以区别对待头文件和代码文件。大多数情况下,我使用了gcc
5.2.0,尽管旧版本也是如此。
我明白尝试编译头文件可能并不常见,但是因为我做了尝试找到一个有趣的结果,我想知道发生了什么!
谢谢!
编辑:删除图片。
答案 0 :(得分:3)
您欺骗了编译器命名文件JobState
,而实际上它不是共享库。
这实际上意味着编译器处理整个标头并将其自己的状态保存到文件中。稍后,当您为其提供以 libPoint.so
开头的.c
/ .cpp
文件时,它会从预编译的标头中加载状态,因此不需要再次处理它。因此,您的代码编译速度更快。 在源文件中,只有第一个包含的标头可以从此中受益。
如果从命令中删除#include "Point.hxx"
,GCC会将其命名为-o blah.so
,这是预编译头的预期名称。事实上,如果它的名称不同,GCC甚至都找不到你的PCH。