.lib
)链接到可执行文件时,如果任何可执行文件 .obj 文件定义了与静态库中的一个符号重复的符号,则静态库中的符号将被默默地忽略。
确认(Feb 18 '10 at 17:46 Michael Burr)
MSVC曾经的行为是,如果一个符号在.obj文件和.lib文件中都有定义,它会使用.obj文件中的符号而不发出警告。我记得它还处理这样一种情况:当一个符号在多个库中定义时,它会使用列表中第一个库中的符号。
我不能说我已经尝试过这个问题很长时间了,但如果他们改变了这个行为(特别是.obj定义的符号覆盖了.lib文件中的符号),我会感到惊讶。
对VS 2010 RC进行简短的测试表明,我所描述的行为仍然存在。
('Windows Static Library with Default Functions' 对我来说也是一种确认)
首先,我希望被证明是错误的,但至少对于一个普通的C++函数来说,似乎就是这样。
其次,有没有什么方法可以防止这种情况发生? 我有一个函数,当任何二进制文件链接到包含此函数的静态库时,我想确认实际使用的是静态库中的版本,而不是其他项目中的残留或其他东西。 (请注意:问题中的Fn是test_suite *init_unit_test_suite(int argc,char * argv [])
,因此我无法在实践中更改它,因为它来自第三方库。)
(*): 这是Boost.Test的主函数,应该由我们自定义的静态库提供。如果任何开发人员创建一个单元测试项目 - 这些项目通过属性表自动链接到静态库 - 但错误地定义了该函数,则构建应该中断,而不是使用开发人员提供的函数。