我如何*在Visual-C ++中阻止静态库符号的“弱”链接?

时间:2014-11-04 13:52:04

标签: c++ visual-c++ linker static-libraries weak-linking

就我的实际测试而言,将静态库(.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[]),(*)所以我实际上无法更改它,因为它来自第三方lib。)


(*):这是Boost.Test主函数,应该由我们的自定义静态库提供。如果任何开发人员创建了一个单元测试项目 - 它通过一个属性表自动链接到静态库 - 但错误地也定义了该函数,那么构建应该中断而不是使用dev提供的函数。

1 个答案:

答案 0 :(得分:0)

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

When I needed something similar前一段时间我也无法在MS工具链中找到它,但有两个MS设备接近并且可能很方便:__declspec(selectany)和未记录的{{3} }}。也许链接到一个obj文件并将该符号声明为selectany就可以了?如果没有,可能在exe-obj文件中添加#pragma注释(链接器," / alternatename:_YourSymbol = _DefaultExeSymbol")就可以了。