Обновил Лазарь до 2.2.2 - перестал собираться проект.

Вопросы программирования и использования среды Lazarus.

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

Обновил Лазарь до 2.2.2 - перестал собираться проект.

Сообщение tria » 15.06.2022 16:49:13

Предыдущая версия - 2.0.6
В проекте три ехе файла, 70% модулей используются во всех трех.
Один проект не собирается с ошибкой:
Fatal: Internal error 200709272
Два других с ошибкой:
Error: Compilation raised exception internally

Простенький проект компилится.

Clean up and build не помогает.
tria
постоялец
 
Сообщения: 400
Зарегистрирован: 03.04.2006 11:24:10

Re: Обновил Лазарь до 2.2.2 - перестал собираться проект.

Сообщение Vadim » 15.06.2022 17:50:12

С ихнего сайта:
Эта ошибка вызвана вызовом оператора экспорта из модуля, используемого как для библиотеки, так и для проекта приложения.
Vadim
долгожитель
 
Сообщения: 4074
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Обновил Лазарь до 2.2.2 - перестал собираться проект.

Сообщение Максим » 17.06.2022 01:29:23

Приведённые сообщения всегда указывают на ошибки компилятора.

Какая версия FPC, ОС, разрядность? Где код, демонстрирующий ошибку? С какими параметрами он собирается?

Поиском находится только эта ошибка:
https://gitlab.com/freepascal.org/fpc/s ... sues/29778

Разработчики FPC не могут воспроизвести её в версиях 3.2.0 и выше.
Аватара пользователя
Максим
энтузиаст
 
Сообщения: 597
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Re: Обновил Лазарь до 2.2.2 - перестал собираться проект.

Сообщение tria » 17.06.2022 11:38:41

Win7 х64
Исходников очень много, выкладывать не реально.

Добавлено спустя 5 минут 34 секунды:
Максим писал(а):Приведённые сообщения всегда указывают на ошибки компилятора.
Поиском находится только эта ошибка:
https://gitlab.com/freepascal.org/fpc/s ... sues/29778

Разработчики FPC не могут воспроизвести её в версиях 3.2.0 и выше.


У меня есть такой модуль.
В первое приложение он включен и выдается Fatal: Internal error 200709272, в два других приложения он не влючен

Текст модуля:
Код: Выделить всё
//Содержит экспортные процедуры для вызова из ДЛЛ
unit ExportProcs;

{$mode objfpc}{$H+}
interface

uses
  Classes, SysUtils, Dynlibs, Dialogs;

type
  TLoadedDllRec=record
    Name:string;
    hnd: THandle;
  end;
  PLoadedDllRec=^TLoadedDllRec;

  function EvallDllProc(const DLLName, ProcName:string; Zn:Pointer):boolean;
var
  MasDLL:Array of TLoadedDllRec;


implementation
uses  unZn, CommonFunc, unMd, unExpr;
var i:integer;

//Загружает ДЛЛ и вызывает Инициализировать
//IsFunc - вызваем процедуру или функцию
//RetVal - возвращаемое функцией длл значение
function LoadDLLAndEval(const DLLName, ProcName:string; Zn:Pointer; IsFunc:boolean; var RetVal:variant):boolean;
type
  TDLL_Init=function(Zn:Pointer):pchar; stdcall;
  TDLL_proc=function(Zn:Pointer):boolean; stdcall;
var
  DllRec:PLoadedDllRec;
  i:integer;
  FullDLLName, s:string;
  res:pchar;
  DLL_InitProc:TDLL_Init;
  DLL_proc:TDLL_proc;
begin
  Result:=false;

  {$IFDEF WINDOWS }
  FullDLLName:=DLLName+'.dll';
  {$ENDIF }
  {$IFDEF LINUX }
  FullDLLName:=DLLName+'.so';
  {$ENDIF }

  //Проверим, не загружена ли уже
  DllRec:=nil;
  For i:=0 to Length(MasDLL)-1 do begin
    If MasDLL[i].Name=DllName Then begin
      DllRec:=@MasDLL[i];
      Break;
    end;
  end;

  //Если не загружалась - загрузим
  If DllRec=nil Then begin
    New(DllRec);
    DllRec^.hnd:=LoadLibrary(FullDLLName);
    If DllRec^.hnd=0 Then begin
      ShowMessage('Библиотека '+FullDLLName+'  не найдена');
      Dispose(DllRec);
      Exit;
    end;
    DllRec^.Name:=DLLName;
    SetLength(MasDLL, Length(MasDLL)+1);
    MasDLL[Length(MasDLL)-1]:=DllRec^;

    DLL_InitProc:=TDLL_Init(GetProcAddress(DllRec^.hnd, 'Init'));
    //Если процедура отсутствует, то не вызываем и не ругаемся
    If DLL_InitProc<>nil then begin
      Try
        res:=DLL_InitProc(Zn);
      except
         on E: Exception do res:=pchar(E.Message);
      end;

      If res<>'' Then begin
        ShowMessage(DLLName+' - ошибка вызова процедуры Init: '+res);
        //Выгрузим ДЛЛ
        FreeLibrary(DllRec^.hnd);
        SetLength(MasDLL, Length(MasDLL)-1);
        Dispose(DllRec);//Если раскоментировать перестает в ДЛЛ находить P_ShowMessage
        Exit;
      end;
    end;
  end;

  DLL_proc:=TDLL_proc(GetProcAddress(DllRec^.hnd, ProcName));
  If DLL_proc=nil then begin
    ShowMessage('У библиотеки '+FullDLLName+' не найдена процедура '+ProcName);
    Exit;
  end;

  Try
    Result:=DLL_proc(Zn);
  except
    on E: Exception do ShowMessage('Error eval '+FullDLLName+'.'+ProcName+' :'+E.Message);
  end;

end;

function EvallDllProc(const DLLName, ProcName:string; Zn:Pointer):boolean;
var RetVal:variant;
begin
  Result:=LoadDLLAndEval(DLLName, ProcName, Zn, false, RetVal);
end;

//Функции для каллбек вызова из DLL

procedure P_ShowMessage(Mes:pchar); stdcall;
begin
  ShowMessage(Mes);
end;

//Очищает память
procedure P_Dispose_PChar(s:pchar); stdcall;
begin
  StrDispose(s);
end;

//Возвращает значение реквизита Zn типа "Строка"
function Zn_GetAttrib_str(Zn:TZn; NameRecv:pchar):pchar; stdcall;
var s:string;
begin
  try
    s:=Zn.GetAttrib(NameRecv);
    Result:=StringToPChar(s);
  except
     on E: Exception do ShowMessage('ERROR: Zn_GetAttrib_str ('+NameRecv+') '+E.Message);
  end;
end;

//Возвращает значение реквизита Zn типа "Целый"
function Zn_GetAttrib_int(Zn:TZn; NameRecv:pchar):integer; stdcall;
var s:string;
begin
  try
    Result:=Zn.GetAttrib(NameRecv);
  except
     on E: Exception do ShowMessage('ERROR: Zn_GetAttrib_int ('+NameRecv+') '+E.Message);
  end;
end;

//Возвращает значение реквизита Zn типа Extended
function Zn_GetAttrib_Extended(Zn:TZn; NameRecv:pchar):Extended; stdcall;
begin
  try
    Result:=Zn.GetAttrib(NameRecv);
  except
     on E: Exception do ShowMessage('ERROR: Zn_GetAttrib_Extended ('+NameRecv+') '+E.Message);
  end;
end;

//Возвращает количество строк
function Zn_StringCount(Zn:TZn):integer; stdcall;
begin
  Result:=Zn.StringCount;
end;

//Устанавливает текущую строку в документе
procedure Zn_SetStringNum(Zn:TZn; NewStringNum:integer); stdcall;
begin
  Zn.StringNum:=NewStringNum;
end;

//Возвращает значение реквизита строки Zn типа "Строка"
function Zn_GetRowAttrib_str(Zn:TZn; NumStr:integer; NameRecv:pchar):pchar; stdcall;
var s:string;
begin
  try
    s:=Zn.GetTblRecv(NumStr, NameRecv);
    Result:=StringToPChar(s);
  except
     on E: Exception do ShowMessage('ERROR: Zn_GetRowAttrib_str ('+NameRecv+') '+E.Message);
  end;

end;

//Возвращает значение реквизита строки Zn типа Extended
function Zn_GetRowAttrib_Extended(Zn:TZn; NumStr:integer; NameRecv:pchar):Extended; stdcall;
begin
  try
    Result:=Zn.GetTblRecv(NumStr, NameRecv);
  except
     on E: Exception do ShowMessage('ERROR: Zn_GetRowAttrib_Extended ('+NameRecv+') '+E.Message);
  end;
end;

Function Zn_GetAttribWithPoint_str(Zn:TZn; const AtrName:pchar):pchar; stdcall;
var
  RecVal:TRecValue;
begin
  try
    RecVal:=GetAttribWithPoint(Zn, AtrName, md.WorkDate);
    Result:=StringToPChar(RecVal.Value);
  except
     on E: Exception do ShowMessage('ERROR: Zn_GetAttribWithPoint_str ('+AtrName+') '+E.Message);
  end;
end;

exports P_ShowMessage;
exports P_Dispose_PChar;
exports Zn_GetAttrib_str;
exports Zn_GetAttrib_int;
exports Zn_GetAttrib_Extended;
exports Zn_StringCount;
exports Zn_SetStringNum;
exports Zn_GetRowAttrib_str;
exports Zn_GetRowAttrib_Extended;
exports Zn_GetAttribWithPoint_str;
//}

finalization
  //Выгрузим все ДЛЛ
  try
    For i:=0 to Length(MasDLL)-1 do FreeLibrary(MasDLL[i].hnd);
  except end;
end.


Добавлено спустя 9 минут 30 секунд:
При этом пример
https://gitlab.com/freepascal.org/fpc/s ... sues/29778
у меня комплится!
У вас нет необходимых прав для просмотра вложений в этом сообщении.
tria
постоялец
 
Сообщения: 400
Зарегистрирован: 03.04.2006 11:24:10

Re: Обновил Лазарь до 2.2.2 - перестал собираться проект.

Сообщение zub » 17.06.2022 12:12:00

руками попробуй стереть все ppu проекта, включая пакеты если используются
zub
долгожитель
 
Сообщения: 2818
Зарегистрирован: 14.11.2005 23:51:26

Re: Обновил Лазарь до 2.2.2 - перестал собираться проект.

Сообщение tria » 17.06.2022 21:28:42

zub писал(а):руками попробуй стереть все ppu проекта, включая пакеты если используются


Не помогло.
Компоненты чистил в C:\lazarus\components\custom\
Компоненты инсталлируютя, Лазарь пересобирается.
tria
постоялец
 
Сообщения: 400
Зарегистрирован: 03.04.2006 11:24:10

Re: Обновил Лазарь до 2.2.2 - перестал собираться проект.

Сообщение Максим » 18.06.2022 03:17:28

Удалось воспроизвести оба сообщения об ошибке, спасибо за код. Получившиеся два примера добавлены в багтрекер по ссылке выше.

В дальнейшем, пожалуйста, старайтесь выкладывать компилирующийся код, чтобы не приходилось тратить время на его адаптацию.
Аватара пользователя
Максим
энтузиаст
 
Сообщения: 597
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Re: Обновил Лазарь до 2.2.2 - перестал собираться проект.

Сообщение Vadim » 18.06.2022 04:55:39

Максим
"exports" виноват?
Vadim
долгожитель
 
Сообщения: 4074
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Обновил Лазарь до 2.2.2 - перестал собираться проект.

Сообщение Максим » 18.06.2022 16:15:30

Сложно сказать. Первый пример успешно собирается, если раскомментировать объявление функции в интерфейсной части модуля. Второй пример, насколько я помню, начинал успешно собираться, если убрать из него пару функций (вместе с их exports).
Аватара пользователя
Максим
энтузиаст
 
Сообщения: 597
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Re: Обновил Лазарь до 2.2.2 - перестал собираться проект.

Сообщение tria » 19.06.2022 11:32:34

Виноват exports
Убрал модуль ExportProcs из проекта - компиляция прошла успешно.
Спасибо всем откликнувшимся.
На версии lazarus-2.0.6-fpc-3.0.4-win32 все работало.

Отвечаю не часто - это не основная работа, работаю периодически по вечерам, извините за паузы в сообщениях.
tria
постоялец
 
Сообщения: 400
Зарегистрирован: 03.04.2006 11:24:10

Re: Обновил Лазарь до 2.2.2 - перестал собираться проект.

Сообщение Максим » 19.06.2022 15:41:38

tria писал(а):Виноват exports

Или то, что эти функции не были объявлены в интерфейсной части модуля.
Или, непонятным образом, их "неправильное" количество в модуле.
Или фаза луны.

Это ошибка в компиляторе, поэтому чудеса возможны.
Аватара пользователя
Максим
энтузиаст
 
Сообщения: 597
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Re: Обновил Лазарь до 2.2.2 - перестал собираться проект.

Сообщение MaratIsk » 20.06.2022 13:40:42

{$mode objfpc} попробуй {$mode delphi}
MaratIsk
новенький
 
Сообщения: 89
Зарегистрирован: 20.08.2009 18:15:20

Re: Обновил Лазарь до 2.2.2 - перестал собираться проект.

Сообщение tria » 23.06.2022 10:54:47

MaratIsk писал(а):{$mode objfpc} попробуй {$mode delphi}

Не помогло...
tria
постоялец
 
Сообщения: 400
Зарегистрирован: 03.04.2006 11:24:10

Re: Обновил Лазарь до 2.2.2 - перестал собираться проект.

Сообщение tria » 25.06.2022 17:45:41

В 2.0.12 эта ошибка уже есть. В 2.0.6 - нет
tria
постоялец
 
Сообщения: 400
Зарегистрирован: 03.04.2006 11:24:10


Вернуться в Lazarus

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

Сейчас этот форум просматривают: Vitto V и гости: 12

Рейтинг@Mail.ru