如何创建库?

Pin*_*oyd 23 c++ makefile compilation

假设我有10*.hpp和*.cpp文件,我需要编译代码.我知道我将需要许多不同代码的相同文件.我可以使用那些允许我简单编写的文件创建一个"包"

#include<mypackage>
Run Code Online (Sandbox Code Playgroud)

代替

#include"file1.hpp"
#include"file2.hpp"
...
#include"file10.hpp"
Run Code Online (Sandbox Code Playgroud)

每次我需要这个"包"时,我都不需要编写一个makefile.

更确切地说,我使用linux.

Joh*_*ing 40

CPP源(H文件和CPP文件)的集合可以一起编译到"库"中,然后可以在其他程序和库中使用.有关如何执行此操作的具体信息是特定于平台和工具链的,因此我将其留给您以发现详细信息.但是,我将提供一些您可以阅读的链接:

使用gnu编译器创建共享和静态库[gcc]

演练:创建和使用动态链接库(C++)

库可以分为两种类型:源代码库和二进制库.也可以有这两种类型的混合 - 库既可以是源库,也可以是二进制库.源代码库就是这样的:代码集合作为源代码分发; 通常是头文件.大多数Boost库都属于这种类型.二进制库被编译到可由客户端程序运行时加载的包中.

即使在二进制库的情况下(显然在源库的情况下),也必须向库的用户提供头文件(或多个头文件).这告诉编译器客户端程序在库中查找哪些函数等.库编写者经常做的是单个主头文件由库导出的所有内容的声明组成,客户端将#include是该头.稍后,对于二进制库,客户端程序将"链接"到库,这会将标头中提到的所有名称解析为可执行地址.

在编写客户端头文件时,请记住复杂性.在某些情况下,您的某些客户只想使用您库中的一些部分.如果您编写一个包含库中所有内容的主头文件,则会不必要地增加客户端编译时间.

处理此问题的常用方法是为库的相关部分提供单独的头文件.如果你想到Boost的一个库,那么Boost就是一个例子.Boost是一个庞大的库,但如果你想要的只是正则表达式功能,你只能使用#include与正则表达式相关的头来获得该功能.如果你想要的只是正则表达式的东西,你不必包括所有的Boost.

在Windows和Linux下,二进制库可以进一步细分为两种类型:动态和静态.在静态库的情况下,库的代码实际上是"导入"(缺少更好的术语)到客户端程序的可执行文件中.您可以分发静态库,但只有客户端在编译步骤中才需要这样做.当您不希望强制客户端必须使用其程序分发其他文件时,这很方便.它也有助于避免Dependancy Hell.另一方面,动态库不会直接"导入"到客户端程序中,而是在执行时由客户端程序动态加载.在多个程序使用相同的动态库的情况下,这既减小了客户端程序的大小,也减少了磁盘占用空间,但是必须使用客户端程序分发和安装库二进制文件.


Cla*_*dio 6

在 Linux 上:

g++ 标志 -shared -Wl,-soname,libLIBNAME.so.1 -o libLIBNAME.VERSION OBJECT_FILES

在哪里

FLAGS:典型标志(例如,-g、-Wall、-Wextra 等)

LIBNAME:您的库的名称

OBJECT_FILES:编译cpp文件产生的对象文件

VERSION:您的库的版本