3

就我的实际测试而言,当在 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 主函数,应该由我们的自定义静态库提供。如果任何开发人员创建了一个单元测试项目——它通过属性表自动链接到静态库——但也错误地定义了函数,则构建应该中断,而不是使用开发人员提供的函数。

4

1 回答 1

0

我认为如果您链接独立的 obj 文件,而不是打包在静态库中,链接器的行为会有所不同。至少你应该得到一些关于符号重复的警告/错误。

当我不久前需要类似的东西时,我也无法在 MS 工具链中找到它,但是有两个 MS 设备接近并且可能很方便:__declspec(selectany)和未记录的#pragma /alternatename。也许链接到 obj 文件并将符号声明为 selectany 可以解决问题?如果没有,也许在 exe-obj 文件中添加 #pragma comment(linker, "/alternatename:_YourSymbol=_DefaultExeSymbol") 就可以了。

于 2014-11-05T10:35:58.130 回答