编写它们与普通的 C++ 程序有什么不同,减去 main() 函数?
除了库提供服务供其他程序使用的明显区别外,通常(*)没有区别。
* 在 gcc 中的类/函数默认导出 - 在 VC++ 中不是这种情况,您必须使用__declspec(export)
.
编译后的程序如何成为库?它显然不是一个可执行文件,那么我该如何将“test.cpp”变成“test.dll”?
这取决于您的编译器。在 Visual Studio 中,您可以在项目配置中指定这一点。在 gcc 中创建一个静态库,你通常编译你的代码,然后使用ar
. 要创建共享,您首先要编译(使用-fpic
标志来启用与位置无关的代码生成,这是共享库的要求),然后-shared
在目标文件上使用标志。更多信息可以在手册页中找到。
一旦我得到它的格式,我如何将它包含在另一个程序中?
同样,这有点依赖于编译器。在 VS 中,如果它是一个共享库,当包含您希望使用的类/函数时,应该用 a 标记__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
:
大多数开源项目都有一个自述文件,其中提供了更详细的说明,如果有的话,我建议您看一下。