Using FreeBASIC Built Libraries with GCC
 
by Jeff Marshall

显示如何使用FreeBASIC创建一个静态库,然后使用GCC作为编译器从C程序中调用它。

  • Minimum fbc version tested is v0.18.2b

本文介绍Windows的全局使用,但在其他平台上对FreeBASIC的应用程序类似。

在本教程中:
简单测试

对于这个简单的测试,我们将创建一个FreeBASIC静态库,一个没有任何依赖关系。这将使第一次更容易,并允许我们检查基础是否正常工作:

首先我们需要一个库,为此,它只是一个简单的函数,它将一起添加两个整数并返回结果。请注意在我们的过程定义中使用cdeclAlias.默认情况下,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.bastest2.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构建的库时。


参考