OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 21:14

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: Code file for ... not found
СообщениеДобавлено: Понедельник, 17 Май, 2010 14:43 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Поясните мне как понимать сообщение
Цитата:
command error: code file for libgobject-2.0-0 not found

Зачем он ему вообще нужен? Ведь используются лишь символы dll-библиотеки.
Причём, исполняемый файл работает исправно.

BlackBox версии 1.6RC5.

Вот на таком простом примере:
Код:
MODULE GnomeHello;

   IMPORT
      SYSTEM,
      WinApi,
      lg  := GnomeGlib,
      lo  := GnomeGObject,
      gdk := GnomeGdk,
      ls  := GnomeGObjectStuff,
      gtk := GnomeGtk;
   
   PROCEDURE MessageBox (title, msg: ARRAY OF CHAR; buttons: SET): INTEGER;
   BEGIN
      RETURN WinApi.MessageBoxW(0, msg, title, buttons)
   END MessageBox;
   
   PROCEDURE [ccall] delete_event (
        widget: gtk.PGtkWidget;
        event: gdk.PGdkEvent;
        user_data: lg.gpointer
      );
   BEGIN
      IF MessageBox('delete_event', "DELETE_EVENT", {}) = 0 THEN END;
   END delete_event;

   PROCEDURE [ccall] hello (
        widget: gtk.PGtkWidget;
        data: lg.gpointer
      );
   BEGIN
      IF MessageBox('Hello World', "HELLO WORLD", {}) = 0 THEN END;
   END hello;

   PROCEDURE [ccall] destroy
   (
     widget: gtk.PGtkWidget;
     data: lg.gpointer
   );
   BEGIN
      gtk.gtk_main_quit();
   END destroy;

   PROCEDURE Q*();
   BEGIN
      IF MessageBox('q', "Q", {}) = 0 THEN END;
   END Q;

   PROCEDURE HelloWorld* ();
      VAR
         (* GtkWidget is the storage type for widgets *)
         window: gtk.PGtkWidget;
         button: gtk.PGtkWidget;
         argc: gtk.PInt;
         argv: gtk.PStrList;
   BEGIN
      (* This is called in all GTK applications. Arguments are parsed
      * from the command line and are returned to the application. *)
      (*gdk.gdk_init(SYSTEM.ADR(Kernel.bootInfo.argc), SYSTEM.ADR(Kernel.bootInfo.argv));*)
      (*gtk.gtk_init(SYSTEM.ADR(Kernel.bootInfo.argc), SYSTEM.ADR(Kernel.bootInfo.argv));*)
      
      gtk.gtk_init(argc, argv);

      (* create a new window *)
      window := gtk.gtk_window_new(gtk.GTK_WINDOW_TOPLEVEL);


      (* When the window is given the "delete-event" signal (this is given
      * by the window manager, usually by the "close" option, or on the
      * titlebar), we ask it to call the delete_event () function
      * as defined above. The data passed to the callback
      * function is NULL and is ignored in the callback function.*)
      ls.g_signal_connect(window, "delete-event", SYSTEM.ADR(delete_event), NIL);

      (*
      /* Here we connect the "destroy" event to a signal handler.
      * This event occurs when we call gtk_widget_destroy() on the window,
      * or if we return FALSE in the "delete_event" callback. *)
      ls.g_signal_connect(window, "destroy", SYSTEM.ADR(destroy), NIL);

      (* Sets the border width of the window. *)
      gtk.gtk_container_set_border_width(window(gtk.PGtkContainer), 10);

      (* Creates a new button with the label "Hello World". *)
      button := gtk.gtk_button_new_with_label("Hello World");

   (* When the button receives the "clicked" signal, it will call the
      * function hello() passing it NULL as its argument.  The hello()
      * function is defined above.      *)

      ls.g_signal_connect(button, "clicked", SYSTEM.ADR(hello), NIL);

      (* This will cause the window to be destroyed by calling
      * gtk_widget_destroy(window) when "clicked".  Again, the destroy
      * signal could come from here, or the window manager. *)
      ls.g_signal_connect_swapped(button, "clicked",
      SYSTEM.ADR(gtk.gtk_widget_destroy), SYSTEM.VAL(lg.gpointer, window));

      (* This packs the button into the window (a gtk container). *)
      gtk.gtk_container_add(window(gtk.PGtkContainer), button);

      (* The final step is to display this newly created widget. *)
      gtk.gtk_widget_show(button);

      (* and the window *)
      gtk.gtk_widget_show(window);

      (* All GTK applications must have a gtk_main(). Control ends here
      * and waits for an event to occur (like a key press or
      * mouse event). *)
      gtk.gtk_main();

   END HelloWorld;

END GnomeHello.

GnomeHello.HelloWorld


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Code file for ... not found
СообщениеДобавлено: Понедельник, 17 Май, 2010 14:48 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Роман М. писал(а):
Поясните мне как понимать сообщение
Цитата:
command error: code file for libgobject-2.0-0 not found
здесь "code file" = "dll"-библиотека


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Code file for ... not found
СообщениеДобавлено: Понедельник, 17 Май, 2010 14:50 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Но ведь файл (libgobject-2.0-0.dll) существует! Он находится в корневой папке ББ, как и остальные DLL.

Значит, ББ не там ищет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Code file for ... not found
СообщениеДобавлено: Вторник, 18 Май, 2010 18:19 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Предлагаю вашему вниманию такую особенность (или ошибку).

1. Создайте модуль
Код:
MODULE TestLibDll;

   IMPORT WinApi;
   
   PROCEDURE MsgBox*(title, msg: ARRAY OF CHAR; buttons: SET);
   BEGIN
      IF WinApi.MessageBoxW(0, title, msg, buttons) = 0 THEN END;
   END MsgBox;

END TestLibDll.

Скомпилируйте его.
Скомпонуйте его в библиотеку libtest.dll:
:!: DevLinker.LinkDll libtest.dll := TestLibDll~

2. Переименуйте libtest.dll в libtest-win32-1.0-0.dll
3. Создайте модуль
Код:
MODULE TestLibDllInt ["libtest-win32-1.0-0"];

   IMPORT WinApi;
   
   PROCEDURE MsgBox*(title, msg: ARRAY OF CHAR; buttons: SET);

END TestLibDllInt.
Скомпилируйте его.
4. Создайте модуль
Код:
MODULE TestLibLoad;

   IMPORT t := TestLibDllInt;
   
   PROCEDURE Run*;
      VAR
   BEGIN
      t.MsgBox('q', "Q", {})
   END Run;

END TestLibLoad.
Скомпилируйте его.

5. И наконец, запустите
:!: TestLibLoad.Run

Получим ошибку
Цитата:
command error: code file for libtest-win32-1.0-0 not found


Отсюда следует вывод, что для командера имя библиотеки libtest-win32-1.0-0.dll не является допустимым.
Догадка: связано с дополнительной точкой в имени файла.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Code file for ... not found
СообщениеДобавлено: Вторник, 18 Май, 2010 21:48 

Зарегистрирован: Четверг, 12 Июнь, 2008 17:30
Сообщения: 37
Try this:
! DevLinker.LinkDll libtest.dll := TestLibDll # ~

you may lost #


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Code file for ... not found
СообщениеДобавлено: Вторник, 18 Май, 2010 22:01 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Насчёт '#' верно замечено. Я и вправду упустил. Только это всё равно не решило проблемы.
Зато EXE исполняется без каких-либо проблем.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Code file for ... not found
СообщениеДобавлено: Среда, 19 Май, 2010 12:22 

Зарегистрирован: Четверг, 12 Июнь, 2008 17:30
Сообщения: 37
Роман М. писал(а):
Насчёт '#' верно замечено. Я и вправду упустил. Только это всё равно не решило проблемы.
Зато EXE исполняется без каких-либо проблем.


do you unload old dll(no export procedure which has been loaded in system)?
I have checked, no problem.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Code file for ... not found
СообщениеДобавлено: Среда, 19 Май, 2010 13:27 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
maliya писал(а):
do you unload old dll(no export procedure which has been loaded in system)?
I have checked, no problem.
Я заново скомпилировал эскпортируемый (export) интерфейс модуля TestLibDll, скомпоновал (linked) в файл libtest.dll, переименовал в "libtest-win32-1.0-0.dll" (проблема именно в файле с таким именем). Затем перезапустил BlackBox и получил ту же ошибку при запуске TestLibLoad.Run.
Зато с именем файла libtest.dll таких проблем не замечено.

Люди, проверьте, сможет ли кто из вас воспроизвести мою ошибку.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Code file for ... not found
СообщениеДобавлено: Среда, 19 Май, 2010 13:44 

Зарегистрирован: Четверг, 12 Июнь, 2008 17:30
Сообщения: 37
In my system use your example


Вложения:
Test.rar [2.81 КБ]
Скачиваний: 441
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Code file for ... not found
СообщениеДобавлено: Среда, 19 Май, 2010 14:16 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Я давал библиотеке имя libtest-win32-1.0-0.dll (с точкой после "1"), а не libtest-win32-1-0-0.dll .
Или ты предлагаешь мне изменять стандартные имена библиотек из-за этой ошибки, как решение ситуации?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Code file for ... not found
СообщениеДобавлено: Среда, 19 Май, 2010 14:33 

Зарегистрирован: Четверг, 12 Июнь, 2008 17:30
Сообщения: 37
Роман М. писал(а):
Я давал библиотеке имя libtest-win32-1.0-0.dll (с точкой после "1"), а не libtest-win32-1-0-0.dll .
Или ты предлагаешь мне изменять стандартные имена библиотек из-за этой ошибки, как решение ситуации?


MSDN:

HINSTANCE LoadLibrary(
LPCTSTR lpLibFileName // address of filename of executable module
);

lpLibFileName
Points to a null-terminated string that names the executable module (either a .DLL or .EXE file). The name specified is the filename of the module and is not related to the name stored in the library module itself, as specified by the LIBRARY keyword in the module-definition (.DEF) file.
If the string specifies a path but the file does not exist in the specified directory, the function fails.
If a path is not specified and the filename extension is omitted, the default library extension .DLL is appended. However, the filename string can include a trailing point character (.) to indicate that the module name has no extension.
......


the win only load .dll or exe module,you module name is wrong.
or you can do:
MODULE TestLibDllInterface["libtest-win32-1.0-0.dll"];


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Code file for ... not found
СообщениеДобавлено: Среда, 19 Май, 2010 15:01 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Провёл такой тест:
Код:
MODULE TestLibLoad;

   IMPORT
      SYSTEM,
      WinApi;
   
   PROCEDURE MessageBox (title, msg: ARRAY OF CHAR; buttons: SET): INTEGER;
   BEGIN
      RETURN WinApi.MessageBoxW(0, msg, title, {})
   END MessageBox;
   
   PROCEDURE Run*;
      VAR r: INTEGER; h: WinApi.HANDLE;
   BEGIN
      h := WinApi.LoadLibrary("libtest-win32-1.0-0.dll");
      IF h # 0 THEN
         r := WinApi.FreeLibrary(h);
         r := MessageBox("Info", "DLL loaded successfully.", {})
      END
   END Run;

END TestLibLoad.

:!: TestLibLoad.Run
Сообщается об успешной загрузке libtest-win32-1.0-0.dll . :roll:

Так что ошибка именно в BlackBox.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Code file for ... not found
СообщениеДобавлено: Среда, 19 Май, 2010 15:01 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Как уже указал maliya, имя библиотеки в TestLibDllInt нужно было задавать полное, с расширением. Иначе загрузчик ищет файл libtest-win32-1.0-0, а не libtest-win32-1.0-0.dll

P.S. В ББ конечно есть косяки, но напраслину не надо, да?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Code file for ... not found
СообщениеДобавлено: Среда, 19 Май, 2010 16:08 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Понял. Признаю свою ошибку.
Я полагал, что расширение BlackBox добавляет сам.

maliya и Иван, спасибо вам за пояснение. Надо читать внимательнее в следующий раз.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Часовой пояс: UTC + 3 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB