在我学习C++的过程中,我遇到了动态和静态库.
我通常得到它们的要点:编译代码以包含在其他程序中.
但是,我想了解一些关于它们的事情:
main()函数?.dylib和.a文件MySQL的C++连接器)我发现的与图书馆有关的所有内容似乎都是针对那些已经知道如何使用它们的人.但是,我没有.(但是想!)
谢谢!
(我还应该注意到我使用的是Mac OS X,虽然我更喜欢保持IDE中立或面向命令行,但我使用的是QtCreator/Netbeans)
ken*_*ytm 19
写它们与普通的C++程序有什么不同,减去main()函数?
没有.
编译后的程序如何成为一个库?它显然不是可执行文件,所以如何转换,将'test.cpp'称为'test.dll'?
-dynamiclib在编译时传递标志.(结果的名称仍然是默认的a.out.在Mac OS X上,您应该将动态库命名为lib***.dylib,并在Linux上,lib***.so(共享对象))
一旦我得到它的格式,我如何将它包含在另一个程序中?
首先,创建一个头文件,以便其他程序可以#include知道dylib中可以使用哪些函数.
其次,链接到你的dylib.如果你的dylib被命名为libblah.dylib,你将-lblah标志传递给gcc.
是否有一个标准的位置,所以无论编译器/链接器需要它们都可以轻松找到它们?
/usr/lib或/usr/local/lib.
动态库和静态库之间有什么区别(技术上和实际上)?
基本上,对于静态库,整个库嵌入到它"链接"到的文件中.
我如何在我的代码中使用第三方库(我正在盯着MySql C++连接器的.dylib和.a文件)
见第3个答案.
Ida*_*n K 12
除了图书馆为其他程序提供服务的明显区别外,通常(*)没有区别.
*默认情况下导出gcc类/函数 - 在VC++中不是这种情况,你必须使用显式导出__declspec(export).
这取决于您的编译器.在Visual Studio中,您可以在项目配置中指定它.在gcc中创建一个静态库,您可以正常编译代码,然后使用它将其打包到一个存档中ar.要创建共享,首先编译(使用-fpic标志启用位置无关代码生成,共享库的要求),然后使用-shared目标文件上的标志.更多信息可以在手册页中找到.
这又是一个依赖于编译器的.在VS中,如果它是一个共享库,当包含您希望使用的类/函数时,它应该标记为__declspec(import)(这通常使用ifdefs),并且您必须指定共享库的.lib文件以进行链接.对于静态库,您只需指定.lib文件(不需要导出/导入,因为代码将在您的可执行文件中结束).
在gcc中,您只需指定使用链接的库-llibrary_name.
在这两种情况下,您都需要为您的客户端提供一些头文件,其中包含供公众使用的函数/类.
如果它是你自己的图书馆,那么这取决于你.通常,您可以指定要查看的链接器附加文件夹.我们lib的源代码树中有一个文件夹,其中所有.lib(或.a/.so)文件最终都会被添加到另一个文件夹中以查找.
如果你在UNIX上发布一个库,常见的地方通常是/usr/lib(或/usr/local/lib),这也是gcc默认搜索的地方.
将程序链接到静态库时,库的代码最终会出现在可执行文件中.实际上,这会使您的可执行文件变得更大,并且由于显而易见的原因而更难以更新/修复静态库(需要新版本的可执行文件).
共享库与可执行文件分开,并由程序引用,并且(通常)在需要时在运行时加载.
也可以加载共享库而无需链接它们.它需要更多的工作,因为您必须手动加载共享库和您想要使用的任何符号.在Windows上,这是使用LoadLibrary/ GetProcAddress和在POSIX系统上使用dlsym/完成的dlopen.
这通常通过包含必要的头文件并链接到适当的库来实现.
链接静态库的简单示例foo如下所示:gcc main.cpp -o main.o -L/folder/where/foo.a/is/at -lfoo.
大多数开源项目有一个自述文件,提供更详细的说明,如果有的话,我建议你看看它.
| 归档时间: |
|
| 查看次数: |
9803 次 |
| 最近记录: |