Совмесная компиляция Си и FB
Участников: 3
Страница 1 из 1
Совмесная компиляция Си и FB
Наскока я понимаю процесс компиляции следующий:
1) код из синтаксиса ФБ транслируется в ассемблерный
2) полученый код компилится ассемблеровским компилятором в объектный файл
3) линкером полученый файл собирается с другими библиотеками, в которых реализованы все основные функции языка
Так вот эти библиоти используются при компиляции и сишных программ (вообще наскока я понимаю это и есть родные сишные библиотеки) + используются библиотеки, написанные специально для FB.
Поэтому возникла идея (и думаю многим она итересна) использовать куски программы написаные на Си, другие на FB, откомпилив их в объектные файлы и собрав. Помоему тут нет ничего сложного, единственное что останавливает, так ето отсутствие информации по процессу линкования.
fbc.exe автоматизирует процесс, делая одновременно компиляцию, и линковку с нужными библиотеками.
Получить только объектный файл мона получить с использованием ключа -c.
Наскока я понял, линкером является ld.exe который входит в дистрибутив FreeBASIC-а (в линуксе вродебы он используется вообще для сборки программ на всех языках).
Для начала я решил попробовать собрать хотябы только програмку на FB.
Теперь беру ld.exe
с ключем -T lib\win32\i386pe.x указываем где валяется инструкция для линкера
после указываю свой файл test.o
Долго етой фигней маялся, в итоге ниче хорошего из етого не вышло((
Если ктонить с етим сталкивался, подскажите как ето делать лучше (полюбому в сишке ето делается подобным образом)
1) код из синтаксиса ФБ транслируется в ассемблерный
2) полученый код компилится ассемблеровским компилятором в объектный файл
3) линкером полученый файл собирается с другими библиотеками, в которых реализованы все основные функции языка
Так вот эти библиоти используются при компиляции и сишных программ (вообще наскока я понимаю это и есть родные сишные библиотеки) + используются библиотеки, написанные специально для FB.
Поэтому возникла идея (и думаю многим она итересна) использовать куски программы написаные на Си, другие на FB, откомпилив их в объектные файлы и собрав. Помоему тут нет ничего сложного, единственное что останавливает, так ето отсутствие информации по процессу линкования.
fbc.exe автоматизирует процесс, делая одновременно компиляцию, и линковку с нужными библиотеками.
Получить только объектный файл мона получить с использованием ключа -c.
Наскока я понял, линкером является ld.exe который входит в дистрибутив FreeBASIC-а (в линуксе вродебы он используется вообще для сборки программ на всех языках).
Для начала я решил попробовать собрать хотябы только програмку на FB.
- Код:
fbc -c test.bas
Теперь беру ld.exe
с ключем -T lib\win32\i386pe.x указываем где валяется инструкция для линкера
после указываю свой файл test.o
- Код:
bin\win32\ld.exe -T lib\win32\i386pe.x test.o
Долго етой фигней маялся, в итоге ниче хорошего из етого не вышло((
Если ктонить с етим сталкивался, подскажите как ето делать лучше (полюбому в сишке ето делается подобным образом)
Re: Совмесная компиляция Си и FB
Ну... я немного продвинулся в своих поисках.
Нашел у fbc ключик -v.
Во че мне он сказал:
говорит
будем искать
Нашел у fbc ключик -v.
Во че мне он сказал:
- Код:
FreeBASIC Compiler - Version 0.20.0 (08-10-2008) for win32 (target:win32)
Copyright (C) 2004-2008 The FreeBASIC development team.
Configured as standalone
compiling: test.bas -o test.asm
assembling: D:\share\fb\fb_0.20.0b\bin\win32\as.exe --32 --strip-local-absolute "test.asm" -o "test.o"
linking: -T "D:\share\fb\fb_0.20.0b\lib\win32\i386pe.x" -subsystem console -s --stack 1048576,1048576 -L "D:\share\fb\fb_0.20.0b\lib\win32" -L "./" "D:\share\fb\fb_0.20.0b\lib\win32\crt2.o" "D:\share\fb\fb_0.20.0b\lib\win32\crtbegin.o" "test.o" -o "test.exe" -( -luser32 -lfb -lgcc -lmsvcrt -lkernel32 -lmingw32 -lmingwex -lmoldname -lsupc++ "D:\share\fb\fb_0.20.0b\lib\win32\fbrt0.o" -) "D:\share\fb\fb_0.20.0b\lib\win32\crtend.o"
- Код:
compiling: test.bas -o test.asm
- Код:
fbc -r test.bas
- Код:
assembling: D:\share\fb\fb_0.20.0b\bin\win32\as.exe --32 --strip-local-absolute "test.asm" -o "test.o"
- Код:
bin\win32\as.exe --32 --strip-local-absolute "test.asm" -o "test.o"
- Код:
linking: -T "D:\share\fb\fb_0.20.0b\lib\win32\i386pe.x" -subsystem console -s --stack 1048576,1048576 -L "D:\share\fb\fb_0.20.0b\lib\win32" -L "./" "D:\share\fb\fb_0.20.0b\lib\win32\crt2.o" "D:\share\fb\fb_0.20.0b\lib\win32\crtbegin.o" "test.o" -o "test.exe" -( -luser32 -lfb -lgcc -lmsvcrt -lkernel32 -lmingw32 -lmingwex -lmoldname -lsupc++ "D:\share\fb\fb_0.20.0b\lib\win32\fbrt0.o" -) "D:\share\fb\fb_0.20.0b\lib\win32\crtend.o"
- Код:
bin\win32\ld.exe -T "lib\win32\i386pe.x" -subsystem console -s --stack 1048576,1048576 -L "lib\win32" -L "./" "lib\win32\crt2.o" "lib\win32\crtbegin.o" "test.o" -o "test.exe" -( -luser32 -lfb -lgcc -lmsvcrt -lkernel32 -lmingw32 -lmingwex -lmoldname -lsupc++ "lib\win32\fbrt0.o" -) "lib\win32\crtend.o"
говорит
- Код:
lib\win32/libmingw32.a(main.o):main.c:(.text+0x97): undefined reference to `WinMain@16'
будем искать
Re: Совмесная компиляция Си и FB
Ага!
Делаю так
Удаляю екзешник, и пытаюсь слинковать полученый объектный файл
следовательно я непрально либо транслирую в ассемблер, либо компилю в объектный файл...
Делаю так
- Код:
fbc -C test.bas
Удаляю екзешник, и пытаюсь слинковать полученый объектный файл
- Код:
bin\win32\ld.exe -T "lib\win32\i386pe.x" -subsystem console -s --stack 1048576,1048576 -L "lib\win32" -L "./" "lib\win32\crt2.o" "lib\win32\crtbegin.o" "test.o" -o "test.exe" -( -luser32 -lfb -lgcc -lmsvcrt -lkernel32 -lmingw32 -lmingwex -lmoldname -lsupc++ "lib\win32\fbrt0.o" -) "lib\win32\crtend.o"
следовательно я непрально либо транслирую в ассемблер, либо компилю в объектный файл...
Re: Совмесная компиляция Си и FB
Усе, скомпилить получилось, объяняю по шагам:
1) транслируем в ассемблер
2) компилируем
1) транслируем в ассемблер
- Код:
fbc -R test.bas
2) компилируем
- Код:
bin\win32\as.exe --32 --strip-local-absolute "test.asm" -o "test.o"
- Код:
bin\win32\ld.exe -T "lib\win32\i386pe.x" -subsystem console -s --stack 1048576,1048576 -L "lib\win32" -L "./" "lib\win32\crt2.o" "lib\win32\crtbegin.o" "test.o" -o "test.exe" -( -luser32 -lfb -lgcc -lmsvcrt -lkernel32 -lmingw32 -lmingwex -lmoldname -lsupc++ "lib\win32\fbrt0.o" -) "lib\win32\crtend.o"
Re: Совмесная компиляция Си и FB
Блин, фигово, оказывается существует куча форматов объектных файлов, поетому далеко не всегда получится задуманное, поетому выход использовать статические библиотеки (хотя вродебы их форматы тоже различаются)
Re: Совмесная компиляция Си и FB
tux писал.
Блин, фигово, оказывается существует куча форматов объектных файлов, поетому далеко не всегда получится задуманное, поетому выход использовать статические
библиотеки (хотя вродебы их форматы тоже различаются)
ну да, не всё совместимо, но объектные файлы сделанные в gcc, должны работать. точно не припомню, еще в каком языке используется такой тип библиотек. знаю, что есть форматы
COFF, MS COFF(мелкомягких), а вот во FreeBasic или Gcc не помню. возможно, что это формат elf. это линуксовый формат, но покрайней мере FlatAssembler, при компиляции объектных файлов под Linux, подставляет расширение *.o. как я смотрел, внутренняя структура виндовых *.o компильнутых на FreeBasic или Gcc, и линуксовых сделанных на FlatAssembler- отличается. скорее всего, расширение это ни чего не значит, надо читать в инете про объектные файлы и с чем их едят. к стати, есть универсальный линковщик, alink
http://alink.sourceforge.net
может можно будет помиксовать объектые файлы, единственное, он вроде не поддерживает библиотеки MS COFF, а объектные файлы поддерживает.
насколько известно, что FlatAssembler, напрямую не боддерживает библиотеки типа *.lib, *.a, народ делал объектные файлы, импортировал заголовки, и линковал в alink.
таким образом, во FlatAssembler, подбирались к сишным библиотекам.
Блин, фигово, оказывается существует куча форматов объектных файлов, поетому далеко не всегда получится задуманное, поетому выход использовать статические
библиотеки (хотя вродебы их форматы тоже различаются)
ну да, не всё совместимо, но объектные файлы сделанные в gcc, должны работать. точно не припомню, еще в каком языке используется такой тип библиотек. знаю, что есть форматы
COFF, MS COFF(мелкомягких), а вот во FreeBasic или Gcc не помню. возможно, что это формат elf. это линуксовый формат, но покрайней мере FlatAssembler, при компиляции объектных файлов под Linux, подставляет расширение *.o. как я смотрел, внутренняя структура виндовых *.o компильнутых на FreeBasic или Gcc, и линуксовых сделанных на FlatAssembler- отличается. скорее всего, расширение это ни чего не значит, надо читать в инете про объектные файлы и с чем их едят. к стати, есть универсальный линковщик, alink
http://alink.sourceforge.net
может можно будет помиксовать объектые файлы, единственное, он вроде не поддерживает библиотеки MS COFF, а объектные файлы поддерживает.
насколько известно, что FlatAssembler, напрямую не боддерживает библиотеки типа *.lib, *.a, народ делал объектные файлы, импортировал заголовки, и линковал в alink.
таким образом, во FlatAssembler, подбирались к сишным библиотекам.
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: Совмесная компиляция Си и FB
Для добавления в список линкера объектного файла существует ключ -a
https://freebasic.forum2x2.ru/forum-f10/tema-t71.htm
https://freebasic.forum2x2.ru/forum-f10/tema-t71.htm
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|