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

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

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'];
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1140
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

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

Сообщение Nik » 13.12.2010 01:25:08

2Иван Шихалев
Спасибо! Последний вариант сработал (только после alias нужно двоеточие).

Собственно, выложил на форуме, может кому ещё пригодится: viewtopic.php?f=10&t=6546&start=0&st=0&sk=t&sd=a
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 570
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

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

Сообщение Max123 » 13.05.2015 09:40:17

Вновь приветствую. Кто подскажет, как собрать 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;   
Max123
незнакомец
 
Сообщения: 1
Зарегистрирован: 13.05.2015 09:05:12

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

Сообщение IgorK1 » 29.11.2018 23:59:16

Я нашел решение проблемы линковки 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
Вложения
zlib_1.2.11_x86-64.zip
(45.56 КБ) Скачиваний: 63
IgorK1
незнакомец
 
Сообщения: 2
Зарегистрирован: 31.10.2018 16:53:56

Пред.

Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru