Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我如何“预防”;“弱”;Visual C+中静态库符号的链接+;?_C++_Visual C++_Linker_Static Libraries_Weak Linking - Fatal编程技术网

C++ 我如何“预防”;“弱”;Visual C+中静态库符号的链接+;?

C++ 我如何“预防”;“弱”;Visual C+中静态库符号的链接+;?,c++,visual-c++,linker,static-libraries,weak-linking,C++,Visual C++,Linker,Static Libraries,Weak Linking,就我的实际测试而言,当将静态库(.lib)链接到Visual C++中的可执行文件时,如果任何可执行文件.obj文件定义了与静态库中的符号重复的符号,静态库中的符号将被默默忽略 : MSVC用于在.obj文件中定义符号时 和一个.lib,它将在没有警告的情况下使用.obj文件中的一个。我 回想一下,它还可以处理符号不存在的情况 在多个lib中定义,它将使用名为 第一名 我不能说我已经试过了,但是如果他们 更改了此行为(特别是.obj定义的符号重写) .lib文件中的符号) VS2010RC的一个

就我的实际测试而言,当将静态库(
.lib
)链接到Visual C++中的可执行文件时,如果任何可执行文件.obj文件定义了与静态库中的符号重复的符号,静态库中的符号将被默默忽略

:

MSVC用于在.obj文件中定义符号时 和一个.lib,它将在没有警告的情况下使用.obj文件中的一个。我 回想一下,它还可以处理符号不存在的情况 在多个lib中定义,它将使用名为 第一名

我不能说我已经试过了,但是如果他们 更改了此行为(特别是.obj定义的符号重写) .lib文件中的符号)

VS2010RC的一个简短测试表明,我描述的行为仍然存在

(对我说)


现在,我希望被证明是错误的,但至少对于一个常规的C++函数来说,这似乎就是它的方式。 第二,有没有办法防止这种情况?我有一个函数,当任何二进制链接到包含此函数的静态库时,我想确认是否实际使用了静态库中的版本,而不是其他项目中的一些剩余内容。(注意:问题中的Fn是

test\u suite*init\u unit\u test\u suite(int argc,char*argv[])
,(*),因此我无法实际更改它,因为它来自第三方库。)



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

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


不久前,我也在MS工具链中找不到它,但有两个MS设备很接近,可能很方便:一个是未记录的。也许链接到一个obj文件并将符号声明为selectany就可以了?如果没有,也许在exe obj文件中添加一个#pragma注释(链接器,“/alternatename:_yoursymble=_defaultexemsymbol”)就可以了。

功能,而不是bug。使用映射文件或链接器的/VERBOSE选项进行诊断。@HansPassant-我从来没有说过这是个bug。它只是。。。嗯,这并不是一直以来的最佳选择。我不想诊断它,我想在它发生时出现一个构建错误。实际上,我在发布Q之前读过你的博客文章,但认为这没有帮助。
selectany
alternatename
都用于与我想要的相反的用途,即在通常无法获得弱链接时获得弱链接。直接链接到目标文件实际上可能会起作用(看看工具链是如何正常工作的),但由于这是一个第三方库,我目前不知道如何做到这一点而不使其成为无法维护的混乱。我不确定我是否理解。你不想在你的exe中强制弱链接吗?这正是导致库定义的符号在重复情况下接管的原因。IIUC你应该可以用pragma alternatename得到这个。啊,好的。这是另一个转折。但我真正喜欢的是在我的可执行文件中根本没有这个符号,并强制执行它。你看,这是Boost.Test主函数,应该由我们的定制静态库提供。如果任何开发人员创建了一个单元测试项目(这些项目通过属性表自动链接到静态库),但也错误地定义了函数,那么构建应该中断,而不是使用开发人员提供的函数。这是一种黑客行为,但您仍然可以如上所述使用#pragma/alternatename,并使用#defaultexecsymbol中断构建。