Visual Studio中的GCC样式弱链接?

def*_*ode 40 c c++ gcc visual-studio weak-linking

GCC能够通过虚拟方式建立符号链接__attribute__((weak)).我想在静态库中使用弱符号,用户可以在其应用程序中覆盖它.一个GCC风格的弱符号会让我这样做,但我不知道它是否可以用visual studio完成.

Visual Studio是否提供类似功能?

Rin*_*ngo 73

你可以这样做,这是C中的一个例子:

/*
 * pWeakValue MUST be an extern const variable, which will be aliased to
 * pDefaultWeakValue if no real user definition is present, thanks to the
 * alternatename directive.
 */

extern const char * pWeakValue;
extern const char * pDefaultWeakValue = NULL;

#pragma comment(linker, "/alternatename:_pWeakValue=_pDefaultWeakValue")
Run Code Online (Sandbox Code Playgroud)

  • 这是一个无证的功能.我在浏览msvcrt源代码时偶然发现了它. (28认同)
  • Raymond Chen 撰写了一篇关于 /ALTERNATENAME 链接器开关的博客文章 https://devblogs.microsoft.com/oldnewthing/20200731-00/?p=104024 (4认同)

AnT*_*AnT 17

MSVC++ __declspec(selectany)涵盖了弱符号的部分功能:它允许您使用外部链接定义多个相同的符号,指示编译器选择几个可用的任何一个.但是,我不认为MSVC++有任何可以覆盖弱符号功能的其他部分的东西:在库中提供"可替换"定义的可能性.

这个BTW让人想知道对MSVC++中标准可替换::operator new::operator delete函数的支持是如何工作的.

  • `::operator new` 作为目标代码发送到 `nothrownew.obj` 中。我假设 CRT 使用与 [`__fltused`-trick](http://blogs.msdn.com/b/oldnewthing/archive/2013/01/08/10383017.aspx) 类似的概念来提取目标代码到模块中,除非它已在其他地方定义。[The Old New Thing](http://blogs.msdn.com/b/oldnewthing/archive/2013/01/09/10383325.aspx) 中描述了 OBJ 和 LIB 的经典链接器规则。 (2认同)

Mic*_*urr 11

MSVC过去表现得如果在.obj文件和.lib中定义符号,它将使用.obj文件中的符号而不发出警告.我记得它还会处理在多个库中定义符号的情况,它将使用列表中名为first的库中的符号.

我不能说我已经尝试了一段时间了,但如果他们改变了这种行为我会感到惊讶(特别是.obj定义的符号会覆盖.lib文件中的符号).

  • 使用VS 2010 RC进行的简短测试表明我所描述的行为仍然存在. (3认同)

den*_*nis 5

我知道的唯一方法。将每个符号放在单独的库中。具有覆盖的用户对象也必须合并到库中。然后将所有内容链接到一个应用程序。必须将用户库指定为输入文件,必须使用选项将您的库传输到链接器/DEFAULTLIB: