Написание библиотеки DLL (SO)

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

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

Написание библиотеки DLL (SO)

Сообщение vkosarev » 21.10.2010 07:16:05

Здравствуйте, уважаемые!
Относительно недавно перешел на Лазарус и столкнулся с такой проблемой (версии 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

Может кто сталкивался с подобным, подскажете чего.
vkosarev
незнакомец
 
Сообщения: 8
Зарегистрирован: 20.10.2010 21:07:18

Re: Написание библиотеки DLL (SO)

Сообщение Nik » 21.10.2010 10:50:34

Опечатка у вас - должно быть FileUtils. И dll здесь не при чём - в обычном исполнимо файле такая же точно ошибка была бы.
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: Написание библиотеки DLL (SO)

Сообщение Phantom_theDeveloper » 21.10.2010 12:25:27

.
Последний раз редактировалось Phantom_theDeveloper 21.10.2010 12:57:06, всего редактировалось 1 раз.
Phantom_theDeveloper
незнакомец
 
Сообщения: 5
Зарегистрирован: 05.02.2009 10:26:54

Re: Написание библиотеки DLL (SO)

Сообщение vkosarev » 21.10.2010 12:46:22

Да нет, все у меня правильно.
Заголовок uses ведь генерируется самим Лазарусом и обычная программа компилирует этот модуль без проблем. А вот если я использую ее в библиотеке - нет.
Попробовал исправить на FileUtils - ошибка та же.
Причем в "обычной" программе (т.е. не в библиотеке) нажимая Ctrl+мышь я перехожу в модуль FileUtil, а вот в библиотеке - нет. Я так понимаю - проблема с путями, но почему она возникает? Ведь это исходные файлы LCL насколько я понял.
vkosarev
незнакомец
 
Сообщения: 8
Зарегистрирован: 20.10.2010 21:07:18

Re: Написание библиотеки DLL (SO)

Сообщение Mr.Smart » 21.10.2010 13:58:10

Необходимо в параметрах проекта библиотеки добавить зависимость пакета LCL.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Написание библиотеки DLL (SO)

Сообщение vkosarev » 21.10.2010 22:00:06

Подскажите как именно это сделать :oops: (все таки есть отличие от дельфы, никак не могу найти)
vkosarev
незнакомец
 
Сообщения: 8
Зарегистрирован: 20.10.2010 21:07:18

Re: Написание библиотеки DLL (SO)

Сообщение Odyssey » 22.10.2010 00:10:57

Меню - Проект - Инспектор проекта. В появившемся окне щелчок на кнопке "+" (Добавить). Закладка "Новая зависимость", поле "Имя пакета", LCL.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Написание библиотеки DLL (SO)

Сообщение vkosarev » 22.10.2010 20:31:34

Теперь возникают такие ошибки:


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
незнакомец
 
Сообщения: 8
Зарегистрирован: 20.10.2010 21:07:18

Re: Написание библиотеки DLL (SO)

Сообщение Mr.Smart » 22.10.2010 21:41:56

vkosarev
Выложите, тогда ваш проект библиотеки. Попробую разобраться. Если это возможно :wink:
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Написание библиотеки DLL (SO)

Сообщение vkosarev » 22.10.2010 21:57:33

Да он собственно выложен в вопросе - во второй части (зеленым цветом).
Отдельно помечены коментариями тело библиотеки и тело модуля (форма пустая).
Грешил было на директиву cdecl, но ошибки возникают даже в случае ее отсутствия.
Не пробовал еще использовать модуль без формы (экспорт функций модуля).

Единственно, что еще приходит в голову - я использую версию 0.9.29 сборки CodeTyphon.
Но ошибки возникают и в версии 0.9.28.2, которую я качал с официального сайта.
vkosarev
незнакомец
 
Сообщения: 8
Зарегистрирован: 20.10.2010 21:07:18

Re: Написание библиотеки DLL (SO)

Сообщение Mr.Smart » 22.10.2010 22:47:34

очень странно :shock: Виджеты не находит! Рушит все мои представления о поиске модулей в Lazarus :oops:

Добавлено спустя 56 секунд:
Взываю к сообществу! Почему? Причина?
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Написание библиотеки DLL (SO)

Сообщение evd » 22.10.2010 22:56:35

Было такое же, что не находил виджеты. Добавил в lpr файл библиотеки uses Interfaces и все собралось.
Аватара пользователя
evd
новенький
 
Сообщения: 21
Зарегистрирован: 13.09.2009 09:42:28
Откуда: Вологда

Re: Написание библиотеки DLL (SO)

Сообщение Mr.Smart » 22.10.2010 23:10:03

evd
Блин! Я проворонил этот момент! Все мои сомнения разрушены! Наверное пятница виновата во всём :oops:
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Написание библиотеки DLL (SO)

Сообщение vkosarev » 23.10.2010 22:32:51

Спасибо, действительно включение Interfaces помогло. Правда при этом пришлось прописать еще порядка 5 путей, ну да ничего.
Библиотека скомпилировалась, я хочу использовать ее процедуру.
Создаю приложение с одной формой (код ниже), на форме кнопка, экспортирую процедуру из библиотеки и навешиваю ее вызов на нажатие кнопки.
Приложение нормально компилируется и запускается, но при нажатии кнопки (т.е. при вызове процедуры) выдается сообщение об ошибке "...вызвал класс исключения '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.
vkosarev
незнакомец
 
Сообщения: 8
Зарегистрирован: 20.10.2010 21:07:18

Re: Написание библиотеки DLL (SO)

Сообщение vkosarev » 26.10.2010 10:45:51

Господа, вопрос об использовании библиотеки еще актуален.
Помогите, кто сможет.
vkosarev
незнакомец
 
Сообщения: 8
Зарегистрирован: 20.10.2010 21:07:18

След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru