gpt4 book ai didi

c++ - 选择要在运行时链接的库

转载 作者:可可西里 更新时间:2023-11-01 02:52:49 25 4
gpt4 key购买 nike

我正在尝试修改 iperf支持另一种协议(protocol)(UDT)。 UDT API 的编写方式反射(reflect)了标准 BSD 调用:

  socket(...);
bind(...);
listen(...);

然后我需要做的是有条件地链接到 UDT 库,以便 iperf 中的这些调用将使用 UDT 代码而不是 TCP 堆栈的套接字接口(interface)。这可以做到吗?我总是可以只加载库并使用 UDT::命名空间有另一个条件路径,但是 1) TCP 路径会有很多重复,2) 在可能不需要的地方有很多变化。如果我不清楚,请告诉我,如有任何关于如何实现此动态链接的建议,我们将不胜感激。

编辑:

使用下面提到的 dlopen() 系列,我可以有以下程序流程:

解析 cmd 行参数 -> 如果请求 UDT,加载库 libudt ->获取并存储所有 UDT BSD 函数(绑定(bind)、监听等)的句柄

此时,我的所有 UDT 函数都存储了函数指针。假设我将它们全部存储在一个名为 udt_calls 的结构中。现在,我对现有代码有问题,它只进行如下调用:

          bind(...)

而不是:

         udt_calls->bind(...)

有没有一种干净的方法可以使用我现在加载的函数指针在我的 udt_calls 结构中全局覆盖整个程序中的任何 BSD 调用?

最佳答案

是的,这是可以做到的。您需要使用动态库加载。在 Windows 中,这是使用 LoadLibrary 完成的。在 Linux 或 Unix 中,它是使用 dlopen 和 friend 完成的。

您需要阅读文档并查看这些函数的示例。一个简短的总结是您创建了一堆函数指针(通常在结构中完成,在 Windows 上有一些技巧可以使它们加载到 C++ 虚函数类中)。然后你使用动态加载函数打开一个库,然后分配你的函数指针指向库中的函数。

然后,您使用函数指针(或 C++ 虚函数)进行函数调用。

编辑:It looks like there are ways to use C++ virtual base classes in Unix as well.

编辑:我相信大多数系统都会让操作系统库使用“弱”符号。这意味着您可以定义自己的同名全局符号并覆盖操作系统库版本。尝试在您自己的程序中声明全局函数指针,以提供全局版本的 bindlisten

另一种选择可能是在结构中声明您的指针,然后使用预处理器定义如下:

#define bind udt_calls->bind

关于c++ - 选择要在运行时链接的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9039219/

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