2

编译是即时完成的:只有你的程序真正使用的 CImg 功能被编译并出现在编译的可执行程序中。这导致代码非常紧凑,没有任何未使用的东西。

有谁知道原理吗?

4

3 回答 3

6

CImg 是一个只有头文件的库,他们大量使用模板,这就是他们所指的。

如果他们使用某种类型的预编译库(.dll/.lib/.a/.so),则库文件必须包含整个CImg 库,无论您实际使用其中的哪些位。

对于静态链接库(.lib 或 .a),链接器可以去除未使用的符号,但这可能取决于优化设置。

当整个库包含在一个或两个头文件中时,它只是在您实际编译时才真正编译#include,因此它与您程序的其余部分属于同一编译过程的一部分,编译器可以轻松确定库的哪些部分是用过,哪些没用。

由于 CImg API 使用模板,因此不会为从未调用的函数生成代码。

不过,他们有点超卖了,因为正如其他答案所指出的那样,未使用的符号通常会被剔除

于 2010-07-18T11:53:28.947 回答
2

对我来说听起来像是相当标准的行为——C++ 链接器通常会丢弃任何未使用的库引用,而不是包含不可调用的代码。同样,优化的构建不会包含不可调用的代码。

于 2010-07-18T08:15:50.930 回答
0

这听起来像 MSVC 的Eliminate Unreferenced Data (/OPT:REF)链接器命令,GCC 也应该有类似的东西

于 2010-07-18T08:34:50.213 回答