如果您 link 访问目标文件但不使用其任何代码,会发生什么情况?
What happens if you link to an object file but don't use any of its code?
假设我在 IDE 中工作,例如 Visual Studio,以使用 C 或 C++ 进行编程。假设我决定静态 link 到目标文件。因为我使用的是 Visual Studio,所以我配置了项目属性 linker 设置(即我不编辑 make 文件)。如果我实际上没有在我的程序中使用任何 linked 代码,会发生什么情况?编译后的代码会是什么样子?会不会肿?
IDE 会检查此类情况以优化 makefile 吗?或者编译器可以检查这个吗?这取决于编译器吗?
基本上这个问题是因为我不知道我需要使用 SFML 中的哪些库,因此我决定 link 所有库作为临时操作。 link访问未实现的目标文件会使我的二进制文件膨胀吗?或者它们会被 IDE、编译器等优化掉吗?
大多数优化器都能够找到并消除无用代码,其中包括从未调用过的函数。在 Visual C++ 上,这至少需要编译器的 /Gy
标志 ("Enable Function-Level Linking")。其他标志应默认打开。
> type a.cpp
#include <iostream>
void not_called()
{
std::cout << "Hello, world!\n";
}
int main()
{
}
> cl /nologo /EHsc /Gy a.cpp /link /verbose | findstr not_called
Discarded "void __cdecl not_called(void)" (?not_called@@YAXXZ) from a.obj
/Gy
标志将单个函数打包到 COMDATs, which gives more information to the linker and allows it to remove unused or redundant functions. The linker flag /OPT:REF ("eliminates functions and data that are never referenced") 也是必需的,但默认情况下它是打开的。
当您创建新项目时,Visual C++ 将默认在发布模式下正确设置这些标志。但是,如果您静态链接到一个库,则必须确保它也是使用 /Gy
.
编译的
请注意,其中 none 适用于与 DLL 的链接。由于无法提前告知构建时将使用哪些函数,因此 DLL 将始终包含导出的所有内容。
假设我在 IDE 中工作,例如 Visual Studio,以使用 C 或 C++ 进行编程。假设我决定静态 link 到目标文件。因为我使用的是 Visual Studio,所以我配置了项目属性 linker 设置(即我不编辑 make 文件)。如果我实际上没有在我的程序中使用任何 linked 代码,会发生什么情况?编译后的代码会是什么样子?会不会肿?
IDE 会检查此类情况以优化 makefile 吗?或者编译器可以检查这个吗?这取决于编译器吗?
基本上这个问题是因为我不知道我需要使用 SFML 中的哪些库,因此我决定 link 所有库作为临时操作。 link访问未实现的目标文件会使我的二进制文件膨胀吗?或者它们会被 IDE、编译器等优化掉吗?
大多数优化器都能够找到并消除无用代码,其中包括从未调用过的函数。在 Visual C++ 上,这至少需要编译器的 /Gy
标志 ("Enable Function-Level Linking")。其他标志应默认打开。
> type a.cpp
#include <iostream>
void not_called()
{
std::cout << "Hello, world!\n";
}
int main()
{
}
> cl /nologo /EHsc /Gy a.cpp /link /verbose | findstr not_called
Discarded "void __cdecl not_called(void)" (?not_called@@YAXXZ) from a.obj
/Gy
标志将单个函数打包到 COMDATs, which gives more information to the linker and allows it to remove unused or redundant functions. The linker flag /OPT:REF ("eliminates functions and data that are never referenced") 也是必需的,但默认情况下它是打开的。
当您创建新项目时,Visual C++ 将默认在发布模式下正确设置这些标志。但是,如果您静态链接到一个库,则必须确保它也是使用 /Gy
.
请注意,其中 none 适用于与 DLL 的链接。由于无法提前告知构建时将使用哪些函数,因此 DLL 将始终包含导出的所有内容。