假设我在像 Visual Studio 这样的 IDE 中使用 C 或 C++ 进行编程。假设我决定静态链接到一个目标文件。因为我使用的是 Visual Studio,所以我配置了项目属性链接器设置(即我不编辑 make 文件)。如果我实际上没有在我的程序中使用任何链接代码,会发生什么情况?编译后的代码会是什么样子?会不会肿?
IDE 会检查此类情况以优化 makefile 吗?或者编译器可以检查这个吗?这取决于编译器吗?
这个问题基本上是因为我不知道我需要使用 SFML 中的哪些库,因此我决定链接到所有库作为临时操作。链接到未实现的目标文件会使我的二进制文件膨胀吗?或者它们会被 IDE、编译器等优化掉吗?
最佳答案
大多数优化器都能够找到并消除无用代码,其中包括从未调用过的函数。在 Visual C++ 上,这至少需要 /Gy
标志(“启用函数级链接”)给编译器。其他标志应默认打开。
> 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 中,这为链接器提供了更多信息,并允许它删除未使用或冗余的功能。链接器标志 /OPT:REF (“消除从未引用的函数和数据”)也是必需的,但默认情况下处于启用状态。
当您创建新项目时,Visual C++ 将默认在 Release模式下正确设置这些标志。但是,如果您要与库进行静态链接,则必须确保它也是使用 /Gy
编译的。
请注意,这些都不适用于与 DLL 的链接。由于无法提前告知构建时将使用哪些函数,因此 DLL 将始终包含导出的所有内容。
关于c++ - 如果您链接到目标文件但不使用其任何代码,会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39067227/