Страница 2 из 2

Re: Правильные obj-файлы для FPC

СообщениеДобавлено: 12.12.2010 23:20:01
Иван Шихалев
Код: Выделить всё
function _malloc(Size: Integer): Pointer; cdecl; public;

или
Код: Выделить всё
function _malloc(Size: Integer): Pointer; cdecl; [public];

или
Код: Выделить всё
function _malloc(Size: Integer): Pointer; cdecl; [public,alias '_malloc'];

Re: Правильные obj-файлы для FPC

СообщениеДобавлено: 13.12.2010 01:25:08
Nik
2Иван Шихалев
Спасибо! Последний вариант сработал (только после alias нужно двоеточие).

Собственно, выложил на форуме, может кому ещё пригодится: viewtopic.php?f=10&t=6546&start=0&st=0&sk=t&sd=a

Re: Правильные obj-файлы для FPC

СообщениеДобавлено: 13.05.2015 09:40:17
Max123
Вновь приветствую. Кто подскажет, как собрать zlib 1.2.8 с помощью gcc чтобы полученные файлы *.o можно было скормить Лазарусу 64 битному?
Версия 1.2.5 приспособлена, объявлены функции и тд.
Вручную скомпилировал с помощью minGw x86_64-4.9.2-win32-seh-rt_v4-rev2
Получилась кучка о-файлов. Заменяю их в проекте, и после этого появляется такое:
Код: Выделить всё
main1.dpr(2942,1) Error: Multiple defined symbol .refptr.zcfree
main1.dpr(2942,1) Error: Multiple defined symbol .refptr.zcalloc
main1.dpr(2942,1) Error: Multiple defined symbol .refptr.zcalloc
main1.dpr(2942,1) Error: Multiple defined symbol .refptr.zcfree
main1.dpr(2942,1) Fatal: There were 4 errors compiling module, stopping


Уж не знаю что делать и как убрать. Поиском тоталом по тексту ".refptr.zcalloc" дает 3 файла, а тут упоминание в двух, т.е. как бы последние 2 раза повторно.
Но что с ними делать.... В исходниках zlib не разобрался, что там комментить, как описано и для чего..

Сами функции у меня описаны и к ним нет претензий (а если убрать то и еще ошибка zcalloc и zcfree что не найдены)

Код: Выделить всё
function zcalloc(opaque: Pointer; items, size: Integer): Pointer;  cdecl; [public,alias: 'zcalloc'];
begin
  result:=GetMemX(items * size);

end;   

Re: Правильные obj-файлы для FPC

СообщениеДобавлено: 29.11.2018 23:59:16
IgorK1
Я нашел решение проблемы линковки zlib в 64-bit fpc/Lazarus:

В файлах zlib inflate.c and deflate.c заменить строки (всего будет 4 строки):

strm->zalloc = zcalloc;
strm->zfree = zcfree;

на

strm->zalloc = (voidpf)0;
strm->zfree = (voidpf)0;

Теперь fpc будет корректно линковать .o файлы zlib в 64 bit.

В файле zutils.h перед
typedef struct z_stream_s {
я добавил строку для выравнивания рекорда (чтобы в 64-bit SizeOf(z_stream) совпадала с Pascal кодом:
#pragma pack(4)

В Pascal исходниках не забывать перекрыть callback'и на zalloc и zfree у z_stream

zStream.zalloc:=zcalloc2;
zFZStream.zfree:=zcfree2;

function zcalloc2(opaque: Pointer; items, size: Integer): Pointer; cdecl;
begin
GetMem(Result, items * size);
end;

procedure zcfree2(opaque, block: Pointer); cdecl;
begin
FreeMem(block);
end;

и вызывать ДО инициализации zlib функций
deflateInit_
InflateInit_
InflateInit2_

P.S. Прилагаю 61 bit *.o файлы от zlib 1.2.11 адаптированные для fpc/Lazarus 64-bit