在Visual Studio中的GCC风格弱链接?

GCC有能力通过__attribute__((weak))符号链接。 我想在静态库中使用弱符号,用户可以在应用程序中重写。 一个GCC风格的弱符号会让我这样做,但我不知道是否可以用Visual Studio来完成。

Visual Studio是否提供了类似的function?

MSVC ++有__declspec(selectany) ,它覆盖了弱符号的一部分function:它允许你用外部链接定义多个相同的符号,指示编译器select几个可用的符号中的任何一个。 但是,我不认为MSVC ++有什么可以涵盖弱符号function的其他部分:提供库中“可replace”定义的可能性。

顺便说一下,这使得人们不禁要问,如何在MSVC ++中支持标准的replaceable ::operator new::operator delete函数。

你可以做到这一点,这是一个例子在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") 

MSVC用于performance如此,如果一个.obj文件和.lib中定义一个符号它将使用.obj文件没有警告。 我记得它也会处理符号在多个库中定义的情况,它将使用列表中第一个库中的符号。

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

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

没有一个MS-VC相当于这个属性。 请参阅http://connect.microsoft.com/VisualStudio/feedback/details/505028/add-weak-function-references-for-visual-cc 。 我会提出一些可怕的build议:在这里阅读它的目的: http : //www.kolpackov.net/pipermail/notes/2004-March/000006.html它主要是定义函数,如果它们的符号存在,被使用,否则,不是,所以…

为什么不使用预处理器来达到这个目的呢,还有“如果你需要这样做”的巨大警告? (我不是推荐预处理器的粉丝)。

例:

 #ifdef USE_MY_FUNCTION extern void function(); #endif 

然后在应用程序逻辑中正确调用,由#ifdef语句包围。 如果你的静态库作为链接进程的一部分被链接,那么调整定义来定义USE_MY_FUNCTION。

不是一个直接的相当,非常丑陋,但这是我能想到的最好的。

这样做的一种方法是通过LoadLibrary和GetProcAddress手动实现它。

Interesting Posts