这个问题很简单。假设我编译并链接了这段代码:
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/