Автор 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 библиотек.
См. также