静态库是编译代码,可以在构建可执行文件时使用。
当编译器生成可执行文件时,首先将基本源文件转换为对象文件。然后将对象文件链接在一起以生成可执行文件。当我们编译源代码时,我们不一定要做一个可执行文件。我们可以将所有目标文件(由源组成)分组到一个名为静态库的单个文件中。
库被称为静态的,因为当它所包含的对象文件后来被链接到可执行文件时,库中所有需要的代码的副本被添加到可执行文件中。
图书馆制作完成后,我们可以使用它所包含的代码,就像我们直接使用我们的程序编译源代码一样。
以下是使用这三个文件创建静态库的简单示例:
- mylib.bas - 图书馆的来源
- mylib.bi - 图书馆的标题
- mytest.bas - 一个测试程序
我们的库将是提供单一功能的单个模块:
'' mylib.bas
'' compile with: fbc -lib mylib.bas
'' Add two numbers together and return the result
Public Function Add2( ByVal x As Integer, ByVal y As Integer ) As Integer
Return( x + y )
End Function
使用以下方式编译库:
fbc -lib mylib.bas
-lib 选项指示编译器使用源代码
mylib.bas,并将其转换为对象文件
mylib.o,然后将对象文件存储到库文件(也称为存档)
libmylib.a中。一个库可能包含许多具有许多功能的模块(源文件),但是对于这个简单的例子,它只是一个。
为了在某??些其他源代码中使用库,我们需要一些告诉编译器在库中究竟是什么的方法。一个很好的方法是将库的声明(也称为接口或API)放入头文件中。
'' mylib.bi
#inclib "mylib"
Declare Function Add2( ByVal x As Integer, ByVal y As Integer ) As Integer
没有必要编译头文件。我们希望它的源代码,所以它可以包含在其他源文件。
#inclib语句将告诉编译器在最终制作可执行文件时需要链接的静态库的名称。
使用我们的库(.a文件)和标题(.bi文件),我们可以在测试程序中尝试:
'' mytest.bas
'' compile with: fbc mytest.bas
#include once "mylib.bi"
Print Add2(1,2)
#include语句告诉编译器将来自
mylib.bi的源代码,就像我们将其输入原始源一样。通过我们编写我们的包含文件的方式,它告诉编译器需要知道的关于库的一切。
我们用:
fbc mytest.bas
那么当我们运行
mytest可执行文件时,我们应该得到以下结果:
3
制作库时可以使用多个源模块。并且基本程序可以通过包括每个所需的标题来使用多个库。一些库是如此之大,以至于可能使用几个标题。在非常大的项目中,使得很少变化的代码模块中的库可以大大提高编译时间。
库可以选择包含使用
-g 命令行选项指定的调试信息。
对象文件,因此库是平台特定的,在某些情况下特定于编译器和FreeBASIC运行时库的特定版本。
参考