c - 如何防止 Visual C++ 链接器包含地址被占用的每个函数?

标签 c visual-c++ linker unused-variables

这个问题很简单。假设我编译并链接了这段代码:

static char const *foo() { static char const *baz = "0123456789ABCDEF"; return baz; }
static char const *(*bar)() = foo;
int main() { return 0; }

Visual C++ 编译器或链接器似乎自动将字符串 baz 标记为已使用,并包含它,即使它显然从未使用过(尽管 foo的地址被占用)。

有什么方法可以让编译器或链接器避免包含像这样实际上没有使用的代码吗?

最佳答案

将 foo() 和 bar() 分离到不同的 obj 文件(即,不同的 cpp)是一个好的开始 - 但还不够。事实证明,当链接可执行文件时,链接器无论如何都会拉入使用 exe 构建的每个 obj 文件。

解决方案的第二部分是将带有 foo() 和 bar() 的 cpp 提取到一个静态库中,并让带有 main() 的可执行文件链接到它。

AFAICT 确切的 VC 链接设备没有正式记录,但由 Raymond 调查过 here .此外,如果您选中“Use Library dependency inputs”,这将不起作用。 '

关于c - 如何防止 Visual C++ 链接器包含地址被占用的每个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40443911/

相关文章:

c - 在函数的参数中声明指针类型以修改链表

c - C 中的 Strcmp 不工作

c - 打印指针值

c++ - 使用 CFileDialog 选择文件时的绘画问题

c++ - 如何在 C++ 中使用带有 LoadLibrary 的 COM DLL

c - 更改字符串字节顺序的最有效方法?

c# - 如何在 Visual C++ 控制台应用程序中添加 C# dll?

gcc - 在 g++ 中使用符号 '_end' 会导致段错误

c - GCC 下与 Cortex-M0 的变量对齐

linux - gnu ld 链接器行为的变化