【发布时间】:2014-11-04 13:52:04
【问题描述】:
就我的实际测试而言,在将静态库 (.lib) 链接到 Visual-C++ 中的可执行文件时,如果任何可执行的 .obj 文件在静态库,静态库中的符号将被默默地忽略。
Confirm ( Feb 18 '10 at 17:46 Michael Burr):
MSVC 过去的行为是,如果在 .obj 文件中定义了符号 和一个 .lib 它会在没有警告的情况下使用 .obj 文件上的那个。一世 回想一下,它还可以处理符号所在的情况 在多个库中定义,它将使用名为 列表中的第一位。
我不能说我已经尝试过一段时间了,但如果他们这样做,我会感到惊讶 改变了这种行为(特别是 .obj 定义的符号覆盖 .lib 文件中的符号)。
对 VS 2010 RC 的简短测试表明我描述的行为仍然存在。
('Windows Static Library with Default Functions' seems also a confirmation 给我)
首先,我很想被证明是错误的,但至少对于常规的 C++ 函数来说,情况似乎是这样的。
其次,有什么办法可以防止这种情况发生吗?我有一个函数,当任何二进制链接到包含此函数的静态库时,我想确认静态库中的版本 是 实际使用的,而不是一些剩余的或其他的任何东西项目。 (请注意:有问题的 Fn 是 test_suite* init_unit_test_suite(int argc, char* argv[]), (*) 所以我实际上无法更改它,因为它来自第三方库。)
(*): 这是 Boost.Test 主函数,应该由我们的自定义静态库提供。如果任何开发人员创建了一个单元测试项目——它通过属性表自动链接到静态库——但也错误地定义了函数,则构建应该中断而不是使用开发人员提供的函数。
【问题讨论】:
-
功能,不是错误。使用映射文件或链接器的 /VERBOSE 选项进行诊断。
-
@HansPassant - 我从未说过这是一个错误。它只是......好吧,这并不是一直以来的最佳选择。我不想诊断它,我想在它发生时出现构建错误。
标签: c++ visual-c++ linker static-libraries weak-linking