Написание библиотеки DLL (SO)
Модератор: Модераторы
Написание библиотеки DLL (SO)
Здравствуйте, уважаемые!
Относительно недавно перешел на Лазарус и столкнулся с такой проблемой (версии 0.9.28.2, 0.9.29):
Вот такой код (взят пример из книги по Лазарусу) компилируется без проблем:
Library subs ;
function SubStr ( CString : PChar ; FromPos , ToPos : Longint ) : PChar ; cdecl ;
var Length : Integer ;
begin
Length := StrLen ( CString ) ;
SubStr := CString + Length ;
if ( FromPos > 0 ) and ( ToPos >= FromPos ) then
begin
if Length >= FromPos then SubStr := CString + FromPos - 1;
if Length > ToPos then CString [ ToPos ] := # 0 ;
end ;
end ;
exports
SubStr;
end .
Но если я использую в библиотеке модуль и ссылаюсь на него:
{код библиотеки}
library project1;
{$mode objfpc}{$H+}
uses
Classes, Unit1;
{$R *.res}
exports
ShowForm name 'ShowForm'; cdecl;
end.
{код модуля, форма пустая}
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs;
type
TForm1 = class(TForm)
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
procedure ShowForm;
implementation
{$R *.lfm}
procedure ShowForm; cdecl;
begin
with TForm1.Create(nil) do
begin
Hide;
ShowModal;
Free;
end;
end;
end.
На этапе компиляции выдается ошибка unit1.pas(8,22) Fatal: Can't find unit FileUtil used by Unit1
Может кто сталкивался с подобным, подскажете чего.
Относительно недавно перешел на Лазарус и столкнулся с такой проблемой (версии 0.9.28.2, 0.9.29):
Вот такой код (взят пример из книги по Лазарусу) компилируется без проблем:
Library subs ;
function SubStr ( CString : PChar ; FromPos , ToPos : Longint ) : PChar ; cdecl ;
var Length : Integer ;
begin
Length := StrLen ( CString ) ;
SubStr := CString + Length ;
if ( FromPos > 0 ) and ( ToPos >= FromPos ) then
begin
if Length >= FromPos then SubStr := CString + FromPos - 1;
if Length > ToPos then CString [ ToPos ] := # 0 ;
end ;
end ;
exports
SubStr;
end .
Но если я использую в библиотеке модуль и ссылаюсь на него:
{код библиотеки}
library project1;
{$mode objfpc}{$H+}
uses
Classes, Unit1;
{$R *.res}
exports
ShowForm name 'ShowForm'; cdecl;
end.
{код модуля, форма пустая}
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs;
type
TForm1 = class(TForm)
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
procedure ShowForm;
implementation
{$R *.lfm}
procedure ShowForm; cdecl;
begin
with TForm1.Create(nil) do
begin
Hide;
ShowModal;
Free;
end;
end;
end.
На этапе компиляции выдается ошибка unit1.pas(8,22) Fatal: Can't find unit FileUtil used by Unit1
Может кто сталкивался с подобным, подскажете чего.
-
Phantom_theDeveloper
- незнакомец
- Сообщения: 5
- Зарегистрирован: 05.02.2009 09:26:54
.
Последний раз редактировалось Phantom_theDeveloper 21.10.2010 12:57:06, всего редактировалось 1 раз.
Да нет, все у меня правильно.
Заголовок uses ведь генерируется самим Лазарусом и обычная программа компилирует этот модуль без проблем. А вот если я использую ее в библиотеке - нет.
Попробовал исправить на FileUtils - ошибка та же.
Причем в "обычной" программе (т.е. не в библиотеке) нажимая Ctrl+мышь я перехожу в модуль FileUtil, а вот в библиотеке - нет. Я так понимаю - проблема с путями, но почему она возникает? Ведь это исходные файлы LCL насколько я понял.
Заголовок uses ведь генерируется самим Лазарусом и обычная программа компилирует этот модуль без проблем. А вот если я использую ее в библиотеке - нет.
Попробовал исправить на FileUtils - ошибка та же.
Причем в "обычной" программе (т.е. не в библиотеке) нажимая Ctrl+мышь я перехожу в модуль FileUtil, а вот в библиотеке - нет. Я так понимаю - проблема с путями, но почему она возникает? Ведь это исходные файлы LCL насколько я понял.
Необходимо в параметрах проекта библиотеки добавить зависимость пакета LCL.
Подскажите как именно это сделать
(все таки есть отличие от дельфы, никак не могу найти)
Меню - Проект - Инспектор проекта. В появившемся окне щелчок на кнопке "+" (Добавить). Закладка "Новая зависимость", поле "Имя пакета", LCL.
Теперь возникают такие ошибки:
project1.lpr(13,1) Error: Undefined symbol: WSRegisterCustomImageList
project1.lpr(13,1) Error: Undefined symbol: WSRegisterMenuItem
project1.lpr(13,1) Error: Undefined symbol: WSRegisterMenu
project1.lpr(13,1) Error: Undefined symbol: WSRegisterMainMenu
project1.lpr(13,1) Error: Undefined symbol: WSRegisterPopupMenu
project1.lpr(13,1) Error: Undefined symbol: WSRegisterDragImageList
project1.lpr(13,1) Error: Undefined symbol: WSRegisterControl
...
project1.lpr(13,1) Fatal: There were 50 errors compiling module, stopping
project1.lpr(13,1) Error: Undefined symbol: WSRegisterCustomImageList
project1.lpr(13,1) Error: Undefined symbol: WSRegisterMenuItem
project1.lpr(13,1) Error: Undefined symbol: WSRegisterMenu
project1.lpr(13,1) Error: Undefined symbol: WSRegisterMainMenu
project1.lpr(13,1) Error: Undefined symbol: WSRegisterPopupMenu
project1.lpr(13,1) Error: Undefined symbol: WSRegisterDragImageList
project1.lpr(13,1) Error: Undefined symbol: WSRegisterControl
...
project1.lpr(13,1) Fatal: There were 50 errors compiling module, stopping
vkosarev
Выложите, тогда ваш проект библиотеки. Попробую разобраться. Если это возможно
Выложите, тогда ваш проект библиотеки. Попробую разобраться. Если это возможно
Да он собственно выложен в вопросе - во второй части (зеленым цветом).
Отдельно помечены коментариями тело библиотеки и тело модуля (форма пустая).
Грешил было на директиву cdecl, но ошибки возникают даже в случае ее отсутствия.
Не пробовал еще использовать модуль без формы (экспорт функций модуля).
Единственно, что еще приходит в голову - я использую версию 0.9.29 сборки CodeTyphon.
Но ошибки возникают и в версии 0.9.28.2, которую я качал с официального сайта.
Отдельно помечены коментариями тело библиотеки и тело модуля (форма пустая).
Грешил было на директиву cdecl, но ошибки возникают даже в случае ее отсутствия.
Не пробовал еще использовать модуль без формы (экспорт функций модуля).
Единственно, что еще приходит в голову - я использую версию 0.9.29 сборки CodeTyphon.
Но ошибки возникают и в версии 0.9.28.2, которую я качал с официального сайта.
очень странно
Виджеты не находит! Рушит все мои представления о поиске модулей в Lazarus 
Добавлено спустя 56 секунд:
Взываю к сообществу! Почему? Причина?
Добавлено спустя 56 секунд:
Взываю к сообществу! Почему? Причина?
evd
Блин! Я проворонил этот момент! Все мои сомнения разрушены! Наверное пятница виновата во всём
Блин! Я проворонил этот момент! Все мои сомнения разрушены! Наверное пятница виновата во всём
Спасибо, действительно включение Interfaces помогло. Правда при этом пришлось прописать еще порядка 5 путей, ну да ничего.
Библиотека скомпилировалась, я хочу использовать ее процедуру.
Создаю приложение с одной формой (код ниже), на форме кнопка, экспортирую процедуру из библиотеки и навешиваю ее вызов на нажатие кнопки.
Приложение нормально компилируется и запускается, но при нажатии кнопки (т.е. при вызове процедуры) выдается сообщение об ошибке "...вызвал класс исключения 'External: SIGSEGV' ". В чем моя ошибка.
Библиотека скомпилировалась, я хочу использовать ее процедуру.
Создаю приложение с одной формой (код ниже), на форме кнопка, экспортирую процедуру из библиотеки и навешиваю ее вызов на нажатие кнопки.
Приложение нормально компилируется и запускается, но при нажатии кнопки (т.е. при вызове процедуры) выдается сообщение об ошибке "...вызвал класс исключения 'External: SIGSEGV' ". В чем моя ошибка.
Код: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
procedure ShowForm; cdecl; external 'lib';
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowForm;
end;
end.
Господа, вопрос об использовании библиотеки еще актуален.
Помогите, кто сможет.
Помогите, кто сможет.
