我知道这对极客来说似乎很基础.但我想说清楚.
当我想使用Win32 DLL时,通常我只需要调用像LoadLibrary()和GetProcAdderss()这样的API.但最近,我正在使用DirectX9进行开发,我需要添加d3d9.lib,d3dx9.lib等文件.
我听说LIB用于静态链接,DLL用于动态链接.
所以我目前的理解是LIB包含方法的实现,并在链接时静态链接作为最终EXE文件的一部分.虽然DLL在运行时动态加载,但不是最终EXE文件的一部分.
但有时候,DLL文件会附带一些LIB 文件,因此:
检查维基百科后,我记得这些LIB文件称为导入库.但我想知道它如何与我的主应用程序和动态加载的DLL一起工作.
正如RBerteig所说,LIB文件中存在一些与DLL一起出现的存根代码.所以调用序列应该是这样的:
我的主要应用 - > LIB中的stub - >真正的目标DLL
那么这些LIB应包含哪些信息?我能想到以下几点:
我对吗?还有什么吗?
顺便说一句:有没有可以检查导入库的工具?如果我能看到它,就不会再有疑惑了.
我一直在读几本游戏书.他们总是喜欢通过动态链接创建引擎作为静态库.我是c ++的新手,所以当谈到静态库和动态链接库时,我并不是很了解.我所知道的是静态库增加了程序的大小,在你的程序中需要加载DLL链接库.
[编辑]
我玩游戏几乎看起来他们使用DLL来加载声音,灯光,而不是单独加载.当水平加载.因为你在游戏菜单中不一定需要它.
我想发布一个我开发的应用程序,作为Linux和Windows的业余爱好.此应用程序依赖于boost(以及可能的其他库).这种应用程序(国际象棋引擎)的规范是仅提供可执行文件和可能的一些帮助文件.
我认为静态链接库是个好主意,因此可执行文件不会有任何依赖.因此,最终用户可以将可执行文件放在目录中并开始使用它.
然而,在网上进行一些研究时,我发现了一些关于静态链接库的负面评论,有些甚至认为具有静态链接库的应用程序几乎不可移植,这意味着它只能在我的高度相似系统的系统上运行.
那么静态链接库的优点和缺点是什么?
我已经知道可执行文件会更大.但我不明白为什么它会使我的应用程序不那么便携.
我有6个静态库项目:-
- Math
- ECS : depends on Math
- Utility : depends on ECS
- Physics : depends on Utility
- Graphics : depends on Utility
- BaseGame : depends on Physics and Graphics
- Some game (.exe): depends on BaseGame
(The "depends" here is transitive e.g. BaseGame also depends on ECS.)
Run Code Online (Sandbox Code Playgroud)
我通过“静态库”技术成功使用了6个项目。
今天,我听说动态库可以减少编译时间(我们不讨论这是否成立),
因此我阅读了以下链接,并成功创建了一个小演示。
这是我的测试演示中的一些代码:
#ifdef SomeName1_EXPORTS
#define SomeMacro1 __declspec(dllexport)
#else
#define SomeMacro1 __declspec(dllimport)
#endif
SomeMacro1 void someFunction(int someParam);
Run Code Online (Sandbox Code Playgroud)
现在,是将其应用于我的实际项目的激动人心的时刻。 …
Windows仍然使用DLL和Mac程序似乎根本不使用DLL.使用这两种技术有利有弊吗?
如果程序安装包含它需要的所有DLL,那么它将100%正常工作,它是否与静态链接所有库相同?
我试图了解为非开放源代码项目提供相当大的C ++ API的正确方法或正确方法。我不想提供“仅标头”库,因为代码库很大,并且打算封闭源代码。目标如下:
我的目标是Windows以及其他平台(Linux)。
我的理解是由于DLL边界问题,无法创建DLL或共享库。为了解决DLL边界问题,必须使用动态链接的运行时(以及Windows上的正确版本,多线程/调试/等)编译DLL和调用代码,然后所有调试器设置都必须与调试符号相匹配(迭代器调试设置等)。我有一个问题是,例如,如果在Windows上使用Visual Studio中的默认“调试”和“发布”设置来确保编译器设置在/ MD方面匹配,那么我们是否真的可以“安全”使用DLL是否以这种方式(即来回传递STL对象,以及在发生不匹配时肯定会造成危险/失败的各种事物)?做共享对象,*。
使用静态库是否可以解决此问题?静态库和链接到该库的调用代码之间需要多少匹配编译器设置?与DLL(在Windows上)几乎一样的问题吗?
我尝试过在线查找图书馆的示例,但在此方面找不到太多指导。许多资源都在讨论开放源代码解决方案,该解决方案似乎是将标头和实现文件复制到代码库中(仅用于非标头),不适用于封闭源代码。
什么是正确的方法?看来这应该是一个普遍的问题;尽管我想知道大多数商业供应商是否仅使用C接口。
如果可以解决问题,我可以使用静态库。我还可以接受这样的想法:拥有一组具有Y设置变体的X编译器(其中X和Y是要支持的预定选项列表),并拥有一个生成X * Y共享二进制库的构建系统,如果那样的话是“安全的”。
答案是否真的只是与工厂一起执行C接口或创建Pure Abstract接口?(如果是这样,是否有规范的书籍或指南用于编写此文档,但未实现Microsoft COM?)。
我知道Stefanus DuToit的沙漏图案:https://www.youtube.com/watch? v = PVYdHDm0q6Y
我担心这是很多代码重复。
我并不是在抱怨事物的状态,我只是想了解“正确”的方式,希望对其他处于类似位置的人来说,这是一个很好的问题。
我已经查看了这些Stackoverflow参考:
分发Windows C ++库:如何决定创建静态库还是动态库?
静态库API问题(std :: string与char *)
也有评论:
https://www.acodersjourney.com/cplusplus-static-vs-dynamic-libraries/
https://blogs.msmvps.com/gdicanio/2016/07/11/the-perils-of-c-interface-dlls/
我搜索了高低,找不到任何体面的MP3解码器= /
我需要一个可以在gcc/linux下编译的程序.
我能找到的最接近的东西是libmad,它根本没有文档,我能找到的唯一例子是它们主页上的那个,这真的很复杂.
有谁知道我在哪里找到一个?
我是 C++ 语言的新手。当我开始构建一个新项目时,我可以看到两个选项。C++ 可执行文件和 C++ 库。
我尝试在很多地方寻找它们的差异,但什么也没得到。有人可以指导我找到关于这个主题的正确答案吗?
谢谢