【问题标题】:Replacing a dll with the static library用静态库替换dll
【发布时间】:2013-03-11 05:01:37
【问题描述】:

注视点: 我有一些 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 中的函数吗?

感谢任何帮助。

【问题讨论】:

    标签: c++ dll static linker


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 其实我很尴尬,没有想到extern "C"。结合上面 Ben 的帖子完美地完成了这个技巧。我所要做的就是将我的文件从FakeWS2_32.cpp 重命名为FakeWS2_32.c 并定义unsigned short __stdcall _imp__htons(unsigned short a) { return a; }。链接成功。除了这些机制之外,在我的情况下,除了重新实现大约 20 个winsock 函数,您会推荐什么替代方法?
    • 别无选择。我怀疑 Zach 建议不要替换 Windows 附带的网络堆栈……因为您的平台甚至没有 Windows 网络堆栈,所以它不适用(您无法替换不存在的网络堆栈)。
    • 好点。从我的椅子上看,我别无选择。我只是希望能够找到一个足够小的 winsock API 调用子集,我需要重新实现这些调用,并希望我可以使用给定的专有 API 来做到这一点。感谢大家的帮助。它真的很好用。
    【解决方案2】:

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

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

    【讨论】:

    • 在我的函数定义中尝试_imp__ 前缀是我想到的第一件事。没有帮助。如果第三方库是用winsock 头文件中的__declspec(dllimport) 编译的,那么现在更改它对我也无济于事。第三方库是链接错误的来源,我无法重新编译它,因为我没有源代码。还有其他想法吗?
    • 谢谢,本。见下文。这是您的建议和 c 样式链接的结合。
    猜你喜欢
    • 1970-01-01
    • 2011-02-04
    • 2011-01-24
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多