繁体   English   中英

exe和dll共享相同的静态库

[英]exe and dll sharing the same static libraries

我的应用程序解决方案设置如下 - (我正在使用 Visual Studio,这是一个 VC++ 项目)

应用库依赖图

注意:蓝色项目编译为静态库。

如您所见,exe 和 dll 共享一些静态库( core.lib 和 utils.lib ),而 exe 反过来使用 DLL(通过使用导入库的“加载时动态链接”)。

我的问题是它是正确的依赖设置吗? 我看到的问题是,当这个应用程序启动并运行时,进程地址空间中会有一些重复的代码吗? 也就是说,Core.lib 和 Utils.lib 中的所有函数都会出现两次,对吗? 因为,Exe 和 DLL 将把这段代码分别编译进去。

如果是,则处理上述问题的一种方法是将代码移至 dll 专有或保留在 exe 中并通过导入/导出共享它(b/w exe 和 dll)。 但我在核心和实用程序中有很多类对象,我不喜欢在头文件中导出/导入这些类对象(通过附加 __declspec(dllimport/dllexport))的想法,此外我可能最终会将它添加到很多依赖类对象

这是我的理解,我可能错了。 请提出更正建议,处理此类问题的通常方法是什么?

问候,

如果你使用 DLL,你必须一直使用 DLL,所有依赖关系都到 c-runtime。 代码重复(内存占用)并不是最糟糕的问题。 请记住,应用程序分配的内存不能被 dll 释放,反之亦然,除非两者都使用相同的运行时 (dll)。

是的,Core 和 Utils 代码将被复制。 您可以将它们构建为 dll 并在任何地方使用,而不是将它们构建为静态库。

我的建议是:继续按原样编写代码,直到出现问题或出现非常需要更改的情况。

我也遇到了这个问题,并且有一个 Manager 类,它应该是一个单例,它包含一个对象句柄的映射,通过一个静态实例变量(其中包含 std::map<handle,object>) .

我把它放在一个静态库中,发现我的单例在每个链接到它的 DLL 或 EXE 中重复,使我的单例无用(根本不是单例,而是每个链接到我的 DLL/EXE 的实例library),导致通过句柄查找对象失败,因为有多个实例/映射。

为了解决这个问题,我将我的“管理器”类放在一个 DLL 中以避免任何重复。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM