gpt4 book ai didi

c++ - 用静态库替换dll

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:28:37 25 4
gpt4 key购买 nike

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

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

策略:我想编写一个模仿 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 中的函数?

感谢任何帮助。

最佳答案

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

但是,如果您需要做的只是模拟像 htons 这样的简单例程,您就可以摆脱它。

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

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

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

关于c++ - 用静态库替换dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15331490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com