by Jeff Marshall
显示如何使用FreeBASIC创建一个静态库,然后使用GCC作为编译器从C程序中调用它。
- Minimum fbc version tested is v0.18.2b
本文介绍Windows的全局使用,但在其他平台上对FreeBASIC的应用程序类似。
在本教程中:
简单测试
对于这个简单的测试,我们将创建一个FreeBASIC静态库,一个没有任何依赖关系。这将使第一次更容易,并允许我们检查基础是否正常工作:
首先我们需要一个库,为此,它只是一个简单的函数,它将一起添加两个整数并返回结果。请注意在我们的过程定义中使用
cdecl和
Alias.默认情况下,C使用
cdecl调用约定。在FreeBASIC声明中使用
Alias使FreeBASIC和C之间的区分大小写更容易。
C is case sensitive, whereas FreeBASIC normally is not.
'' mylib1.bas
Function Add2Numbers cdecl Alias "Add2Numbers" _
( _
ByVal x As Integer, _
ByVal y As Integer _
) As Integer
Return x + y
End Function
创建一个名为
mylib1.bas的文件,如下所示,并编译:
fbc -lib mylib1.bas.
这将创建我们的静态库
libmylib1.a.接下来,我们需要一个C程序,即将调用我们刚刚创建的库。我们必须添加一个完全匹配我们在FreeBASIC库中的函数的原型。下面的C列表是我们的主要入口点,将设置一些变量来调用
Add2Numbers(),并打印结果。
/* test1.c */
#include <stdio.h>
/* Prototype from libmylib.a */
Int Add2Numbers( Int x, Int y );
Int main ()
{
Int a = 5;
Int b = 7;
Int c = Add2Numbers( a, b );
printf( "a = %d\n", a );
printf( "c = %d\n", b );
printf( "a + b = %d\n", c );
Return 0;
}
要使用FreeBASIC库来编译这个C程序,我们只是按照我们通常的方式编译
test1.c,但也可以告诉它需要哪些库。在我们的例子中,它是
libmylib1.a.
gcc test1.c -L . -l mylib1 -o test1.exe
'-L'选项指示链接器在当前目录中搜索库,而'-l mylib1'表示我们要链接到刚创建的库。这是最简单的情况,因为libmylib1.a库没有依赖关系。如果mylib1.bas需要其他库,例如FreeBASIC运行时库libfb.a,我们还需要将其指定为gcc。
具有依赖关系的FreeBASIC库
在这里我们创建一个FreeBASIC库,它使用FreeBASIC运行时和图形库中的一些功能。在这种情况下,我们必须向GCC指定任何其他需要的库。
'' mylib2.bas
Sub TestGfx cdecl Alias "TestGfx" ()
Screen 12
Line (0,0)-(100,100),15
Sleep
End Sub
使用上面的列表创建一个名为
mylib2.bas的文件,并使用以下命令编译它:
fbc -lib mylib2.bas.
这将创建我们的静态库
libmylib2.a.接下来,我们需要一个C程序,即将调用我们刚刚创建的库。我们必须添加一个完全匹配我们在FreeBASIC库中的函数的原型。此C列表将提供我们的入口点,并在终止之前调用
TestGfx().
/* test2.c */
void TestGfx();
Int main()
{
TestGfx();
Return 0;
}
要直接编译链接
test2.cgcc,我们不仅需要告知
gcc我们要链接
libmylib2.a,而且还需要
libmylib2.a所需的每个其他库。
gcc test2.c -L. -lmylib2 -L"C:\FreeBASIC\lib\win32" "C:\FreeBASIC\lib\win32\fbrt0.o" -lfbgfx -lfb -lgdi32 -o test2.exe
根据我们的FreeBASIC库使用的方式,我们可能会使用多个附加库,我们必须在
gcc命令行上指定库的所有名称。在本例中,FreeBASIC位于“C:\\ FreeBASIC”中,但您应该指定您安装FreeBASIC的任何目录。“C:\\”FreeBASIC \\ lib \\ win32 \\ fbrt0.o“是一个特殊的启动文件,将初始化FreeBASIC运行时库。更具体地说,它在C运行库之后被初始化,但是在我们的任何程序代码被调用之前。附加的
-lfbgfx-lfb-lgdi32是完成链接所需的其他库。实际的库将根据使用的FreeBASIC运行时功能而有所不同,以及为DOS或Linux编译程序的平台。
使用FreeBASIC作为智能链接器
FreeBASIC具有一个整洁的内置功能,可以在库中存储一些额外的信息,指示使用哪些编译时间选项,以及需要哪些依赖库。这是一个FreeBASIC唯一的功能,所以当使用
gcc作为主编译器和链接器时,不会发现这种能力。
如果我们重复使用上一节
mylib2.bas和
test2.c中的示例,但是仅仅是编译和链接它们不同,我们可以自己保存一些打字。此外,我们通常不必知道或记住我们的FreeBASIC构建库的依赖关系。将
mylib2.bas编译为静态库。
fbc -lib mytest2.bas
接下来我们编译C测试程序。请注意
gcc命令行的'-c'选项。这表明我们正在编译C源代码,但是没有链接它。
test2.o仍然具有入口点,但我们将把它放在一个对象文件中,而不是立即创建一个可执行文件。
gcc -c test2.c -o test2.o
最后,我们使用
fbc来执行链接步骤。我们在这里没有编译任何基本的源文件,但是我们将使用FreeBASIC的智能链接功能,使命令行相当简单:
fbc test2.o -l mylib2
这将创建一个名为
test2.exe的可执行文件,因为在命令行上首先指定了
test2.o.FreeBASIC将读取存储在
libmylib2.a中的额外信息,并自动知道要连接的附加库。这比直接使用
gcc更容易,特别是当需要许多额外的FreeBASIC构建的库时。
参考