2

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

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

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

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

问题:

  1. 我的假设是否正确/合理?
  2. 如何机械地设置链接?

我所做的: 我只尝试在一个功能上这样做,但似乎无法链接。这是我在静态库中定义的:

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

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

: error LNK2001: unresolved external symbol __imp__htons@4

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

任何帮助表示赞赏。

4

2 回答 2

1

您不想走用专有网络堆栈替换 Winsock 的道路。

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

您需要将例程标记为extern "C",并且可能需要将它们标记为正在导出。

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

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

于 2013-03-11T05:22:47.717 回答
0

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

您可以删除(可能通过宏)dllimportfrom或使用前缀winsock2.h定义您的实现。_imp__

于 2013-03-11T05:08:35.987 回答