c++ - 如果您链接到目标文件但不使用其任何代码,会发生什么情况?

标签 c++ c linker static-libraries

假设我在像 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/

相关文章:

c++ - 为什么主可执行文件和 dlopen 加载的共享库共享一个命名空间静态变量的拷贝?

c++ - 如何将逗号分隔的数字矩阵放入 C++ 中的动态分配数组中?

c++ - 根据模板函数直接定义非模板函数

c - 为什么即使缺少 return 语句,C 中的程序仍能编译?

C追加/连接字符串 "on the fly"

c# - .NET 构建过程和链接

java - "is unique"Eclipse UML 代表什么?

c++ - Boost.MPI 和 Boost.Interprocess 之间有什么区别?

c - 我如何知道输入是否是字母?我只能接受姓名中的字母和中间首字母的点

linux - 如何将存档的所有对象包含在共享对象中?