Использование FreeBASIC встроенных библиотек с GCC
 
Автор Jeff Marshall

Показывает, как создать статическую библиотеку с FreeBASIC а затем вызвать его из программы C с помощью GCC компилятора.

  • Минимальная версия fbc для теста: v0.18.2b

В этой статье показано использование в Windows, но применение FreeBASIC на других платформах похоже.

В этом уроке:
Простой тест

Для этого простого теста мы собираемся создать FreeBASIC статическую библиотеку без каких-либо зависимостей. Это позволит сделать все легче для первого раза, и позволит нам проверить, что основы работают:

В первую очередь нужна библиотека, и мы в ней сделаем всего одну функцию, которая складывает два числа и возвращает результат. Обратите внимание на использование cdecl и Alias в нашем определении процедуры. По умолчанию C использует соглашение о вызовах cdecl. Использование Alias в FreeBASIC декларации делает соответствующую чувствительность к регистру между FreeBASIC и С. Язык С регистрозависим, в то время как FreeBASIC нет.

'' 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. Далее нам нужно программу на С, которая бы вызвала библиотеку, которую мы только что создали. Мы должны добавить прототип, который точно соответствует функции в библиотеке FreeBASIC. Ниже листинг на языке С является нашей главной точкой входа, в которой мы создадим несколько переменных для вызова 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;
}


Для компиляции C программы, с использованием библиотеки FreeBASIC , мы должны скомпилировать test1.c как вы это обычно делаете, с указанием, какие библиотеки нужны. В нашем случае, это  libmylib1.a.

gcc test1.c -L . -l mylib1 -o test1.exe

Опция '-L .' говорит компоновщику искать библиотеки в текущем каталоге, а '-l mylib1' указывает на то, что мы хотим связать программу с библиотекой, которую мы только что создали. Это самый простой случай использования библиотеки libmylib1.a , которая не требует зависимостей. Если для mylib1.bas будут необходимы другие библиотеки, например в FreeBASIC есть runtime libfb.a, то мы должны будем указать их для GCC.


FreeBASIC библиотека с зависимостями

Здесь мы создаем библиотеку FreeBASIC, который использует некоторые особенности из FreeBASIC Runtime и графической библиотеки. В этом случае мы должны будем указать дополнительные необходимые библиотеки для 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. Далее нам нужно программу на С, которая вызовет библиотеку , которую мы только что создали. Мы должны добавить прототип, который точно соответствует функции в библиотеке FreeBASIC. Этот листинг C обеспечивает нашу точку входа и просто вызывает TestGfx () перед завершением.

/* test2.c */

void TestGfx();

Int main()
{

    TestGfx();

    Return 0;

}


Чтобы собрать и связать test2.c непосредственно с GCC, мы не только должны сказать 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 RunTime библиотеку. В частности, он инициализируется после библиотеки C RunTime, но до любого нашего вызываемого программного кода. Дополнительные библиотеки -lfbgfx, -lfb, -lgdi32  необходимы для завершения компоновки. Фактические библиотеки будут варьироваться в зависимости от используемых функций FreeBASIC RinTime и от платформы (Windows, DOS или Linux), на которой программа компилируется.


Использование FreeBASIC как смарт-компоновщика

FreeBASIC имеет аккуратные встроенные возможности, которые хранят немного дополнительной информации в библиотеке, указывающие на то, какие опции компиляции были использованы, а так же какие зависимые библиотеки необходимы. Это только особенность FreeBASIC, поэтому этот вид возможности не будет найден при использовании GCC в качестве основного компилятора и компоновщика.

Если мы повторно возьмем примеры из предыдущего раздела mylib2.bas and test2.c, и просто скомпилируем, но слинкуем их по другому, то мы избавимся от лишней мороки с кучей опций в командной строке. Кроме того, нам не нужно будет знать и запоминать эти опции и зависимости. Компилируем mylib2.bas как и раньше, чтобы статическую библиотеку.

fbc -lib mytest2.bas

Далее компилируем нашу тестовую программу С. Обратите внимание на опцию '-c' в командной строке gcc. Это означает, что мы просто будем компилировать исходный файл C, но без линковки. test2.o так же будет иметь точку входа, но мы собираем этот файл в объектный файл вместо того, чтобы пытаться сразу создать исполняемый файл.

gcc -c test2.c -o test2.o

Наконец, мы используем FBC для линковки и создания готового исполняемого файла. Мы не компилируем любые исходные файлы basic здесь, но мы собираемся использовать интеллектуальные возможности связывания FreeBASIC , что в результате дает такое простое использование командной строки:

fbc test2.o -l mylib2

Это создаст исполняемый файл с именем test2.exe потому что test2.o был указан первым в командной строке. FreeBASIC будет читать дополнительную информацию, хранящуюся в libmylib2.a и автоматически подключит для связывания дополнительные библиотеки. Это намного легче, чем непосредственно с помощью GCC, особенно когда для связывания необходимо много дополнительных FreeBASIC библиотек.


См. также