编译即时完成: 只有CImg功能才真正使用 由您的程序编译和 出现在已编译的可执行文件 程序。这导致非常紧凑 代码,没有任何未使用的东西。
任何人都知道原理吗?
答案 0 :(得分:6)
CImg是一个仅限标题的库,它们使用模板,这是他们所指的。
如果他们使用某种预编译库(.dll / .lib / .a / .so),那么库文件必须包含整个 CImg库,无论它位于哪个位你真的用过。
对于静态链接库(.lib或.a),链接器可以然后删除未使用的符号,但这可能取决于优化设置。
当整个库包含在一个或两个头文件中时,它只在#include
时才实际编译,因此它与程序的其余部分编译过程相同,编译器可以可以轻松确定库的哪些部分使用,哪些部分不使用。
由于CImg API使用模板,因此不会为从未调用过的函数生成代码。
虽然它们有点过分,因为正如其他答案所指出的那样,未使用的符号通常会被剥离。
答案 1 :(得分:2)
对我来说听起来很标准 - C ++链接器通常会丢弃任何未使用的库引用,而不是包含不可调用的代码。同样,优化的构建将不包括不可调用的代码。
答案 2 :(得分:0)
这听起来像MSVC的Eliminate Unreferenced Data (/OPT:REF)
链接器命令,GCC也应该有类似的东西