就我的实际测试而言,当在 Visual-C++.lib
中将静态库( .
确认(2010 年 2 月 18 日 17:46 Michael Burr):
MSVC 过去的行为是,如果在 .obj 文件和 .lib 中定义符号,它将使用 .obj 文件中的符号而不会发出警告。我记得它还可以处理符号在多个库中定义的情况,它将使用库中列表中第一个命名的库。
我不能说我已经尝试过一段时间了,但是如果他们改变了这种行为(尤其是 .obj 定义的符号会覆盖 .lib 文件中的符号),我会感到惊讶。
使用 VS 2010 RC 进行的简短测试表明我描述的行为仍然存在。
(“具有默认功能的 Windows 静态库”对我来说似乎也是一种确认)
现在首先,我很想被证明是错误的,但至少对于一个常规的 C++ 函数来说,这似乎是这样的。
其次,有什么办法可以防止这种情况发生吗?我有一个函数,当任何二进制链接到包含此函数的静态库时,我想确认实际使用了静态库中的版本,而不是其他项目中的一些剩余内容或其他任何内容。(请注意:有问题的 Fn 是test_suite* init_unit_test_suite(int argc, char* argv[])
, (*) 所以我实际上无法更改它,因为它来自第三方库。)
(*):这是 Boost.Test 主函数,应该由我们的自定义静态库提供。如果任何开发人员创建了一个单元测试项目——它通过属性表自动链接到静态库——但也错误地定义了函数,则构建应该中断,而不是使用开发人员提供的函数。