gpt4 book ai didi

c++ - dll与visual studio之间的循环依赖

转载 作者:可可西里 更新时间:2023-11-01 15:38:25 32 4
gpt4 key购买 nike

我在两个函数之间存在循环依赖。我希望这些函数中的每一个都驻留在它自己的 dll 中。是否可以使用 visual studio 构建它?

foo(int i)
{
if (i > 0)
bar(i -i);
}

-> 应该编译成 foo.dll

bar(int i)
{
if (i > 0)
foo(i - i);
}

-> 应该编译成 bar.dll

我在 visual studio 中创建了两个项目,一个用于 foo,一个用于 bar。通过使用“引用资料”并编译几次,我设法获得了我想要的 dll。但是,我想知道 visual studio 是否提供了一种以干净的方式执行此操作的方法。

如果foo改变了,bar不需要重新编译,因为我只依赖bar的签名,不依赖bar的实现。如果两个 dll 都存在库,我可以将新功能重新编译到两者中的任何一个,整个系统仍然可以工作。

我尝试这样做的原因是我有一个具有循环依赖关系的遗留系统,该系统当前是静态链接的。由于各种原因,我们想转向 dll。我们不想等到我们清理所有循环依赖。我正在考虑解决方案并在 Linux 上使用 gcc 尝试了一些事情,并且可以按照我的建议进行操作。因此,您可以拥有两个相互依赖并且可以相互独立构建的共享库。

我知道循环依赖不是一件好事,但这不是我想要讨论的话题。

最佳答案

它在类 Unix 系统上工作的原因是因为它们在加载时执行实际的链接解析。共享库在加载到进程中之前不知道其函数定义来自何处。这样做的缺点是你也不知道。库可以在任何其他库(甚至是首先启动进程的主二进制文件)中查找和调​​用函数。此外,默认情况下,共享库中的所有内容都会被导出。

Windows 根本不是那样工作的。只有显式导出的东西才会被导出,所有导入都必须在库链接时解析,此时将提供每个导入函数的 DLL 的标识已经确定。这需要一个导入库来链接。

但是,您可以(通过一些额外的工作)解决这个问题。使用 LoadLibrary 打开您喜欢的任何 DLL,然后使用 GetProcAddress 定位您要调用的函数。这样,没有任何限制。但普通方法的限制是有原因的。

当您想从静态库转换为 DLL 时,听起来您似乎假设应该将每个静态库都变成一个 DLL。那不是你唯一的选择。为什么不仅当您将代码确定为适合分层设计且没有循环的自包含模块时才开始将代码移动到 DLL 中?这样,您现在就可以开始这个过程,但仍然一次只攻击一个部分。

关于c++ - dll与visual studio之间的循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/362830/

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