用静态库替换dll

时间:2013-03-11 05:01:38

标签: c++ dll static linker

凝视点: 我有一些C ++代码链接到第三方静态库,链接到ws2_32.lib。

目标: 我正在研究将这个C ++代码移植到基本上是Win32平台的嵌入式平台的方法,除了它不允许任何dll并且具有专有的UDP协议实现。

策略: 我想编写一个模拟winsock API的静态库(或者至少是我关心的这个API的一个子集)。这些相关的winsock函数将作为嵌入式平台支持的专有UDP函数调用的包装。

假设: 我可以将此静态库链接到最终的可执行文件而不是ws2_32.lib。

问题:

  1. 我的假设是否正确/合理?
  2. 如何机械设置链接?
  3. 我做了什么: 我试图只在一个函数上这样做,似乎无法链接。这是我在静态库中定义的内容:

    unsigned short __stdcall htons(unsigned short hostshort) {
        return hostshort;
    }
    

    当我链接时,我收到以下错误:

    : error LNK2001: unresolved external symbol __imp__htons@4
    

    链接消息中的这个__imp__前缀是我不太了解的。在dll中定义的函数的名称是否以某种特殊方式更改,并且我可以在静态库中伪造它以某种方式强制链接器链接到我的函数版本而不是ws2_32.lib中的函数吗?

    感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

您不希望使用专有网络堆栈替换Winsock。

但是,如果您只需要模拟htons这样的简单例程,那么就可以侥幸逃脱。

您需要将例程标记为extern "C",并可能需要将其标记为已导出。

extern "C" 
{
__declspec(dllexport) 
unsigned short __stdcall htons(unsigned short a) { return a; }
}

如果不将它们标记为C兼容的外部,则链接器会执行一些name mangling

答案 1 :(得分:0)

__imp__前缀表示它是DLL函数的trampoline(尾调用)。这使得动态链接变得高效,因为在库加载和修复期间,只有一个地方需要更改库函数的实际地址。编译器会查找它,因为头文件在函数声明中使用了__declspec(dllimport)

您可以从dllimport中剥离(可能通过宏)winsock2.h,也可以使用_imp__前缀定义您的实施。