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文件)的集合可以一起编译到"库"中,然后可以在其他程序和库中使用.有关如何执行此操作的具体信息是特定于平台和工具链的,因此我将其留给您以发现详细信息.但是,我将提供一些您可以阅读的链接:
库可以分为两种类型:源代码库和二进制库.也可以有这两种类型的混合 - 库既可以是源库,也可以是二进制库.源代码库就是这样的:代码集合作为源代码分发; 通常是头文件.大多数Boost库都属于这种类型.二进制库被编译到可由客户端程序运行时加载的包中.
即使在二进制库的情况下(显然在源库的情况下),也必须向库的用户提供头文件(或多个头文件).这告诉编译器客户端程序在库中查找哪些函数等.库编写者经常做的是单个主头文件由库导出的所有内容的声明组成,客户端将#include是该头.稍后,对于二进制库,客户端程序将"链接"到库,这会将标头中提到的所有名称解析为可执行地址.
在编写客户端头文件时,请记住复杂性.在某些情况下,您的某些客户只想使用您库中的一些部分.如果您编写一个包含库中所有内容的主头文件,则会不必要地增加客户端编译时间.
处理此问题的常用方法是为库的相关部分提供单独的头文件.如果你想到Boost的一个库,那么Boost就是一个例子.Boost是一个庞大的库,但如果你想要的只是正则表达式功能,你只能使用#include与正则表达式相关的头来获得该功能.如果你想要的只是正则表达式的东西,你不必包括所有的Boost.
在Windows和Linux下,二进制库可以进一步细分为两种类型:动态和静态.在静态库的情况下,库的代码实际上是"导入"(缺少更好的术语)到客户端程序的可执行文件中.您可以分发静态库,但只有客户端在编译步骤中才需要这样做.当您不希望强制客户端必须使用其程序分发其他文件时,这很方便.它也有助于避免Dependancy Hell.另一方面,动态库不会直接"导入"到客户端程序中,而是在执行时由客户端程序动态加载.在多个程序使用相同的动态库的情况下,这既减小了客户端程序的大小,也减少了磁盘占用空间,但是必须使用客户端程序分发和安装库二进制文件.
在 Linux 上:
g++ 标志 -shared -Wl,-soname,libLIBNAME.so.1 -o libLIBNAME.VERSION OBJECT_FILES
在哪里
FLAGS:典型标志(例如,-g、-Wall、-Wextra 等)
LIBNAME:您的库的名称
OBJECT_FILES:编译cpp文件产生的对象文件
VERSION:您的库的版本
| 归档时间: |
|
| 查看次数: |
33533 次 |
| 最近记录: |