Как собираться и ссылаться с помощью Gnatmake с общей библиотекой ADA?

StackOverflow https://stackoverflow.com/questions/3902597

  •  29-09-2019
  •  | 
  •  

Вопрос

У меня проблемы снова компилирует заявителя в библиотеке флористов. Оказывается, у меня есть большая проблема с флористом (одинаковые результаты ошибок из новейшей версии Adacore GPL и 2009 года в архиве Debian »). Флорист имеет некоторые низкоуровневые проблемы, но когда я смотрю через сгенерированные файлы, это, кажется, в том числе errno.h правильно.

Вот что происходит, когда я строю флориста:

GCC-4.4 -C -I / usr / share / ada / adainclude / florist demo.adb gcc-4.4 -c -i./ -i / usr / share / ada / adainclude / florist - / usr / share / ada /adainclude/florist/Posix.ADB GCC-4.4 -C -I./ -I / USR / Share / Ada / AdainClude / Florist - /usr/share/ada/adainclude/florist/posix-io.adb gcc- 4.4 -C -I./ -I / USR / Share / Ada / AdainClude / Florist - /usr/share/ada/adainclude/florist/posix-terminal_functions.Adb gcc-4.4 -c -i.ru /i / USR / Share / Ada / AdainClude / Florist - /usr/share/ada/adainclude/florist/posix-c.ru gcc-4.4 -c -i./ -i / usr / share / ada / adainclude / florist - I- /usr/share/ada/adainclude/florist/posix-implementation.ADB POSIX-REVIELTION.GPB: 45: 06: Предупреждение: «System.interrupt_Management.Operations» представляет собой внутреннюю установку GNAT POSIX-RESURVESET.GPB: 45: 06: ПРЕДУПРЕЖДЕНИЕ. Использование данного устройства - недвижимость и зависимая версия POSIX-RESULIVE.GPB: 47: 06: ПРЕДУПРЕЖДЕНИЕ: «System.soft_Links» представляет собой внутреннюю установку GNAT POSIX-RESURVELY.GPB: 47: 06: предупреждение: Использование данного устройства - недвижимость и зависимая версия GCC-4.4 -C -I./ -I / U SR / Share / Ada / AdainClude / Florist - /usr/share/ada/adainclude/florist/ada_streams.ads gcc-4.4 -c -i./ -i / usr / share / ada / adainclude / florist /usr/share/ada/adainclude/florist/Posix-Permissions.ADB GCC-4.4 -C -I./ -I / USR / Share / Ada / Adainclude / Florist - / usr / share / ada / adainclude / florist /posixix -Permissions-implementation.ADB GCC-4.4 -C -I./ -I / USR / Share / Ada / AdainClude / florist - /usr/share/ada/adainclude/florist/posix-process_ydress.adb gnatbind - I / usr / share / ada / adainclude / florist -x demo.ali gnatlink demo.ali -o demoapp ./posix-implementation.O: в функции `posix kimplementation__set_ada_error_code ': posix-resure.Adb :(. Text + 0x19e) undefined Ссылка на `Store_errno './POSIX-Implementation.O: в функции` posix yimlementation__get_ada_error_code': posix-resure.adb :(. Text + 0x1ab): undefined Ссылка на `fetch_erno './posix-implementation.O: в функции` posix kimlementalation__raise_Posix_Error ': POSIX-RESURVELED.ADB :(. Text + 0x234): неопределенная ссылка на ` fetch_errno './POSIX-IMLEMENTATIONATION.O: в функции `posix yimlementation__check__2': POSIX-REVILES.ADB :(. Text + 0x2e5): undefined Ссылка на` fetch_errno './posix-implementation.o: в функции `posix kimplementation__check__3 -Implementation.ADB :(. Text + 0x313): undefined Ссылка на `fetch_errno" ./POSIX-Implementation.O: В функции `posix yimplementation__check_nneg ': posix-resurement.Adb :(. Text + 0x332): undefined Ссылка на` fetch_errno './POSIX-IMLEMENTATION.O:POSIX-IMLEMENTATION.ADB :(.text+0x34e): более неопределенные ссылки на `fetch_errno" следуют ./POSIX-IMLEMENTATION.O: в функции `nosys_neg_one': posix-resure.Adb: (.text + 0xaef): undefined Ссылка на `Store_errno './posix-implementation.O: в функции` notsup_neg_one': posix-review.adb :(. Text + 0xB15): undefined Ссылка на `Store_errno './Posix- Внедрение. recence tetch_errno './POSIX.O: в функции `posix__system_name': posix.adb :(. Text + 0x2F98): undefined Ссылка на` __gnat_florist_uname './posix.o: В функции `posix__node_name': posix.adb: (.text + 0x2fef): undefined Ссылка на `__gnat_florist_uname './posix.o: в функции` posix__release': posix.adb :(. Text + 0x3049): undefined Ссылка на `__gnat_florist_uname './posix.o: в функции. `posix reversion ': posix.adb :(. Text + 0x30A6): undefined Ссылка на` __gnat_florist_uname' ./posix.o: в функции `posix__machine ': posix.adb :(. Text + 0x3103): undefined Ссылка на` __gnat_florist_uname' ./POSIX.O: в функции `posix__host_to_network_byte_Order ': posix.adb :(. Text + 0x4627): undefined Ссылка на` c_htonl' ./Posix.O: В функции `posix__host_to_network_byte_order__2 ': posix.adb :(. Текст + 0x4642 ): undefined Ссылка на `c_htons './Posix.o: в функции` posix__network_to_host_byte_order': posix.adb :(. Text + 0x4655): undefined Ссылка на `c_ntohl './Posix.o: в функции` posix__network_to_hos T_BYTE_ORDER__2 ': POSIX.ADB :(. Text + 0x4670): undefined Ссылка на `c_ntohs' ./posix-io.o: в функции` posix__io__open ': posix-io.adb :(. Text + 0x4d1): undefined Ссылка на `__gnat_florist_Open './Posix-io.o: в функции` posix__io__open_or_create': posix-io.Adb :(. Text + 0xFCA): undefined Ссылка на `__gnat_florist_open 'collect2: ld Возврат 1 Состояние выхода Gnatlink: ошибка при вызове / usr /bin/gcc-4.4 gnatmake: *** Ссылка не удалась. Josh @ mini10: ~ / demo $ gnatbind --i / usr / share / ada / adainclude / florist --i / usr / inkake demo josh @ mini10: ~ / демонстрация $ gnatlink demo ./Posix-implementation.O: в функции `posix kimlementation__set_ada_error_code ': POSIX-RESURATION.ADB :(. Text + 0x19e): undefined Ссылка на `Store_errno' ./posix-implementation.O: в функции` posix kemplementation__get_ada_error_Code ': POSIX-RESILUTY.ADB :(. Text + 0x1ab): undefined для `fetch_errno './POSIX-IMLEMENTATIONATION.O: в функции` posix kemplementation__raise_posix_Error': posix-resure.adb :(. Text + 0x234): undefined Ссылка на `fetch_errno './posix-implementation.O: в функции` posix yimplementation__check__2' : POSIX-REVILEITE.ADB :(. Text + 0x2e5): undefined Ссылка на `fetch_errno './posix-implementation.O: в функции` posix yimlementation__check__3': posix-revestraction.adb :(. Text + 0x313): неопределенная ссылка на `fetch_errno './POSIX-IMLEMENTATIONATION.O: в функции` posix kimplementation__Check_nneg': POSIX-REVILEY.ADB :(. Text + 0x332): undefined Ссылка на `fetch_errno './posix-implementation.o:posix-implementation.b:(.text+0x34e): более неопределенные ссылки на` fetch_errno' follower. `nosys_neg_one ': posix-resure.Adb :(. Text + 0xaef): undefined Ссылка на` Store_errno' ./posix-implementation.o: В функции `notsup_neg_one ': posix-revage.adb :(. Текст + 0xb15) undefined Ссылка на `Store_errno './POSIX-Implementation.O: в функции` posix yimplementalation__Restore_signals_and_raise_posix_Error': POSIX-REVILES.ADB :(. Text + 0xC88): undefined Ссылка на `fetch_errno './posix.o: В функции` posix__system_name' : posix.adb :(. Text + 0x2F98): undefined Ссылка на `__gnat_florist_uname './POSIX.O: В функции` posix__node_name': posix.adb :(. Text + 0x2fef): undefined Ссылка на `__gnat_florist_uname './posix .o: в функции `posix__release ': posix.adb :(. Text + 0x3049): undefined Ссылка на` __gnat_florist_uname' ./POSIX.O: в функции `posix aversion ': posix .ADB :(. Text + 0x30A6): undefined Ссылка на `__gnat_florist_uname './posix.o: в функции` posix__machine': posix.adb :(. Text + 0x3103): undefined Ссылка на `__gnat_florist_uname './posix.o : В функции `posix__host_to_network_byte_order ': posix.adb :(. Text + 0x4627): undefined Ссылка на` c_htonl' ./Posix.o: В функции `posix__host_to_network_byte_order__2 ': posix.adb :(. Text + 0x4642): undefined Ссылка на `c_htons './Posix.O: в функции` posix__network_to_host_byte_order': posix.adb :(. Text + 0x4655): undefined Ссылка на `c_ntohl './Posix.o: В функции` posix__network_to_host_byte_order__2': posix.adb :(. Text + 0x4670): undefined Ссылка на `c_ntohs './posix-io.o: в функции` posix__io__open': posix-io.adb :(. Text + 0x4d1): undefined Ссылка на `__gnat_florist_open './posix-io. O: В функции `posix__io__open_or_create ': posix-io.adb :(. Text + 0xFCA): undefined Ссылка на` __gnat_florist_open' collect2: ld Возврат 1 Состояние выхода Gnatlink: Ошибка при вызове /Usr/bin/gcc-4.4

Похоже, что эта ошибка распространена, если есть проблема с errno.h правильно включена. Но насколько я могу сказать из файла POSIX-CC, все выглядит правильно. У кого-нибудь есть какие-то предложения о том, как это решить? Флорист делает файл правильно строит правильно, поэтому я не знаю, откуда это исходит.

Это было полезно?

Решение

Хорошо, это оказалось большим боль, но я нашел это.

Переплет флориста доступна как общая библиотека, так и статическая библиотека (оба установлены). Вам нужно ссылаться на библиотеку, чтобы разрешить все ссылки (я никогда не смогу на самом деле собрать источник библиотеки в свое приложение). После того, как вы передаете аргумент, чтобы рассказать этап компиляции о библиотеке, вы должны предоставить файлы .AD (по крайней мере) для решения.

Окончательное решение закончилось бы это:

gnatmake -aI/usr/share/ada/adainclude/florist -aO/usr/lib/ada/adalib/florist demo.adb -largs -lflorist

-aI Предоставляет путь к файлам рекламы библиотеки. -aO обеспечивает путь к (в этом случае) файл библиотеки LibFlorist.so и, наконец, (и это сложный), который вы должны пройти -lflorist Чтобы сказать ему, что общее библиотека все это ... но проходит не будет работать. Вы должны разместить -largs Перед ним (для компиляции и линкера), чтобы фаза компиляции проходила параметр! Без этого эти фазы никогда не видят аргумента!

Итак, вы все! Чтобы скомпилировать и связать код с общей библиотекой ADA в рамках Linux (GCC), вам необходимо предоставить заголовки/спецификации библиотеки, местоположение библиотеки и аргумент -llibname, а также -largs, чтобы передать их в нужные места!

Я сейчас счастлив. Надеюсь, это поможет кому-то еще.

Другие советы

Это простой пример использования проекта GNAT для построения с флористом. Я предполагаю, что $ADA_PROJECT_PATH включает в себя каталог, где florist.gpr установлен (в моем случае, $HOME/local/lib/gnat).

Программа образца (я не мог найти никаких простых демонов флористов в Интернете, есть ли?), В id.adb:

with POSIX.Process_Identification;
with Ada.Text_IO; use Ada.Text_IO;
procedure Id is
begin
   Put_Line (POSIX.To_String (POSIX.Process_Identification.Get_Login_Name));
end Id;

Файл проекта (id.gpr), в том же каталоге, что и id.adb:

with "florist";
project Id is
   for Main use ("id.adb");
   for Object_Dir use ".build_id";
   for Exec_Dir use ".";
end Id;

Строить с

$ gnatmake -p -P id.gpr
object directory "/Users/simon/florist-gpl-2010-src/demo/.build_id" created for project id
gcc -c -I- -gnatA /Users/simon/florist-gpl-2010-src/demo/id.adb
gnatbind -I- -x /Users/simon/florist-gpl-2010-src/demo/.build_id/id.ali
gnatlink /Users/simon/florist-gpl-2010-src/demo/.build_id/id.ali -lflorist -o /Users/simon/florist-gpl-2010-src/demo/id

и беги:

$ ./id
simon

Похоже на симпатичные ошибки в саду. Что -то между вашими файлами .h, вашими объектными файлами ADA и вашими библиотеками ссылок C не совсем спарится. Трудно сказать, что хотя.

Ваша лучшая ставка будет искать других пользователей флориста, которые могут столкнуться с такой же проблемой. Их страница проекта На Sourceforge здесь, но, похоже, это не было ужасно активным в течение последних 6 лет. Поскольку последняя версия там старая, возможно, вам нужен компилятор (и ОС?), То, что он станет, чтобы работать. Прозрачный

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top