Страница 1 из 2
Правильные obj-файлы для FPC
Добавлено: 08.12.2010 19:14:58
Nik
Решил на досуге приспособить для Lazarus библиотеку
delphi.zlib, так как хочется иметь под рукой свежую реализацию этого алгоритма, а в составе FPC идёт какой-то совсем древний порт, даже не использующие оригинальные object'ы. Плюс, в своё время я вытащил из Jedy и немного доковырял напильником парочку очень удобных функций-обёрток, упрощающих сжатие файла/папки до вызова одной функции.
Сама либа компилится без проблем, но вот на obj-файлах компилятор клинит:
project1.lpr(20,1) Error: Illegal COFF Magic while reading Zlib\deflate.obj
Гугл подсказал решение: проблема в том, что обжекты собраны компилятором С Builder'а, а FPC кушает только выбросы Visual C и gcc. Мелкомягкий компилятор под рукой нашёлся, но легче от этого не стало, теперь FPC ругается на те же файлы по-другому:
project1.lpr(20,1) Error: Failed reading coff file, illegal reloctype $000A while reading Zlib\deflate.obj
Собственно, вопрос к знатокам. Как собрать obj-файлы оригинальной
zlib, чтобы их скушал FPC. C gcc никогда особо не сталкивался (пару раз доводилось компилировать что-то консольное в Geany под Ubuntu). Пытался скормить Makefile.gcc из комплекта zlib утилите make из состава FPC - не прокатило, говорит:
c:\zlib-1.2.5\win32>make -f Makefile.gcc
make: *** No rule to make target `zlib.h', needed by `adler32.o'. Stop.
Re: Правильные obj-файлы для FPC
Добавлено: 09.12.2010 10:04:33
v-t-l
Re: Правильные obj-файлы для FPC
Добавлено: 09.12.2010 12:27:55
Nik
v-t-l
Уже искал по запросу COFF. Куча советов по компиляции AMS-кода в правильные obj-файлы, и вообще ничего на тему компиляции с-кода.
Re: Правильные obj-файлы для FPC
Добавлено: 10.12.2010 17:30:56
v-t-l
gcc для винды (mingw32+msys).
инструкции по компиляции zlib приблизительно:
запускаем msys
cd в папку с распакованными сырцами zlib
./configure
make
хотя обычно в комплекте идет файлик INSTALL с описанием, как что делать
Re: Правильные obj-файлы для FPC
Добавлено: 10.12.2010 19:16:45
Nik
2
v-t-l Спасибо за наводку. Скомпилировать исходники в правильный object-формат удалось. Но вот модуль всё равно не собирается

Теперь при линковке obj-файлов (
{$L Zlib\deflate.o}) FPC ругается так:
project1.lpr(20,1) Error: Undefined symbol: ZLIBEXAPI_DEFLATEINIT2_$crcB53E13EB
Самое странное, что таких названий вообще нет в исходниках (и object'ах) zlib. Что за ерунда такая, кто-нибудь знает?
Re: Правильные obj-файлы для FPC
Добавлено: 11.12.2010 06:11:34
Sergei I. Gorelkin
В исходниках zlib их и не может быть, это FPC код чем-то недоволен.
Re: Правильные obj-файлы для FPC
Добавлено: 11.12.2010 10:54:58
Nik
Да я понимаю, что FPC. Только имена отсутствующих функций смущают: ZLIBEXAPI_DEFLATEINIT.
Re: Правильные obj-файлы для FPC
Добавлено: 11.12.2010 11:52:30
Sergei I. Gorelkin
zlibexapi - это имя модуля либо класса/объекта, deflateinit2 - имя процедуры, crc (которое дальше) означает, что у процедуры настолько много параметров, что их типы, записанные последовательно, не влезут в ограничение на 127 символов.
Re: Правильные obj-файлы для FPC
Добавлено: 11.12.2010 14:33:41
Nik
Ну, что это такое, в целом, ясно. Осталось понять, что с этим делать. К Delphi такие object'ы легко линкуются, а вот с FPC пока косяк... Может как-то по-другому можно подлинковать с-модули к проекту на FPC?
Re: Правильные obj-файлы для FPC
Добавлено: 11.12.2010 20:30:45
devels
Я точно знаю что fpc понимает объектные файлы от gcc, а делфи только от c++ builder. Obj файлы это файлы от cи билдера.
Re: Правильные obj-файлы для FPC
Добавлено: 11.12.2010 23:02:52
Nik
Так я с помощью gcc уже и сделал (расширение было o, а не obj). Они в принципе прилинковались, но компилятор выдал два десятка сообщений, подобных описанному выше.
Re: Правильные obj-файлы для FPC
Добавлено: 11.12.2010 23:45:27
Иван Шихалев
А как они в модуле объявлены? Должно быть
или
Или и cdecl и name...
Добавлено спустя 2 минуты 31 секунду:Иначе
будет искаться по тому сложносочиненному имени, а не по 'deflateinit2'.
Re: Правильные obj-файлы для FPC
Добавлено: 12.12.2010 12:38:16
Nik
2
Иван ШихалевСпасибо! Действительно, внешние процедуры были объявлены неверно.
Теперь осталось всего 4 ошибки:
project1.lpr(20,1) Error: Undefined symbol: _malloc
project1.lpr(20,1) Error: Undefined symbol: _free
project1.lpr(20,1) Error: Undefined symbol: _longest_match
project1.lpr(20,1) Error: Undefined symbol: _match_init
Откуда у них уши растут - тоже непонятно. Эти название нигде в коде не упоминаются (в o-файлах тоже найти не могу). Может какой-то стандартный модуль нужно подключить?
Re: Правильные obj-файлы для FPC
Добавлено: 12.12.2010 16:26:48
Иван Шихалев
Стоит попробовать подключить модуль cmem. Если не поможет, что-то типа {$LINKLIB C}...
Re: Правильные obj-файлы для FPC
Добавлено: 12.12.2010 20:34:37
Nik
Иван Шихалев писал(а):Стоит попробовать подключить модуль cmem. Если не поможет, что-то типа {$LINKLIB C}...
К сожалению, это не помогло. В cmem нужных функций нет, библиотеку не смог найти (пробовал ещё подключить libc).
Две ошибки победить удалось, скомпилировав исходники zlib с другими параметрами (там в obj-файл линкуется дополнительный кусок ассемблерного кода). С двумя оставшимися (_melloc и _free) кое-что прояснилось. В оригинальном API zlib для Delphi эти функции определены отдельно:
Код: Выделить всё
function _malloc(Size: Integer): Pointer; cdecl;
begin
Result:=AllocMem(Size);
end;
procedure _free(Block: Pointer); cdecl;
begin
FreeMem(Block);
end;
Но если просто скопировать эти функции в нужное место (в самое начало файла, где все вызовы zlib прописаны), то FPC всё-равно ругается:
project1.lpr(20,1) Error: Undefined symbol: _malloc
project1.lpr(20,1) Error: Undefined symbol: _free
Пробовал явно вызывать эти функции как внешние (добавлял external), но тогда компилятор ругается ещё интереснее:
ZLibExApi.pas(214,9) Error: Identifier not found "Result"