Как мне скомпилировать и связать, используя gnatmake с общей библиотекой Ada? - PullRequest
4 голосов
/ 11 октября 2010

У меня проблемы с компиляцией соискателя снова в библиотеке флориста. Оказывается, у меня есть большая проблема с florist (та же ошибка возникает как в самой последней загрузке Adacore GPL 2010 года, так и в версии 2009 года в архиве Debian). У Florist есть некоторые проблемы низкого уровня, но когда я просматриваю сгенерированные файлы, кажется, что они правильно включают 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 -I- /usr/share/ada/adainclude/florist/posix.adb gcc-4.4 -c -I./ -I / usr / share / ada / adainclude / florist -I- /usr/share/ada/adainclude/florist/posix-io.adb gcc-4.4 -c -I./ -I / usr / share / ada / adainclude / florist -I- /usr/share/ada/adainclude/florist/posix-terminal_functions.adb gcc-4.4 -c -I./ -I / usr / share / ada / adainclude / florist -I- /usr/share/ada/adainclude/florist/posix-c.adb gcc-4.4 -c -I./ -I / usr / share / ada / adainclude / florist -I- /usr/share/ada/adainclude/florist/posix-implementation.adb posix-creation.gpb: 45: 06: предупреждение: «SYSTEM.INTERRUPT_MANAGEMENT.OPERATIONS» является внутренним модулем GNAT posix-creation.gpb: 45: 06: предупреждение: использование этого устройства непереносимо и зависит от версии posix-creation.gpb: 47: 06: предупреждение: «SYSTEM.SOFT_LINKS» является внутренним модулем GNAT posix-creation.gpb: 47: 06: предупреждение: использование этого устройства непереносимо и зависит от версии gcc-4.4 -c -I./ -I / usr / share / ada / adainclude / florist -I- /usr/share/ada/adainclude/florist/ada_streams.ads gcc-4.4 -c -I./ -I / usr / share / ada / adainclude / florist -I- /usr/share/ada/adainclude/florist/posix-permissions.adb gcc-4.4 -c -I./ -I / usr / share / ada / adainclude / florist -I- /usr/share/ada/adainclude/florist/posix-permissions-implementation.adb gcc-4.4 -c -I./ -I / usr / share / ada / adainclude / florist -I- /usr/share/ada/adainclude/florist/posix-process_identification.adb gnatbind -I / usr / share / ada / adainclude / florist -x demo.ali gnatlink demo.ali -o demoapp ./posix-implementation.o: В функции `posix__implementation__set_ada_error_code ': posix-creation.adb :(. text + 0x19e): неопределенная ссылка на `store_errno ' ./posix-implementation.o: В функции `posix__implementation__get_ada_error_code ': posix-creation.adb :(. text + 0x1ab): неопределенная ссылка на `fetch_errno ' ./posix-implementation.o: В функции `posix__implementation__raise_posix_error ': posix-creation.adb :(. text + 0x234): неопределенная ссылка на `fetch_errno ' ./posix-implementation.o: В функции `posix__implementation__check__2 ': posix-creation.adb :(. text + 0x2e5): неопределенная ссылка на `fetch_errno ' ./posix-implementation.o: В функции `posix__implementation__check__3 ': posix-creation.adb :(. text + 0x313): неопределенная ссылка на `fetch_errno ' ./posix-implementation.o: В функции `posix__implementation__check_nneg ': posix-creation.adb :(. text + 0x332): неопределенная ссылка на `fetch_errno ' ./posix-implementation.o:posix-implementation.adb:(.text+0x34e): более неопределенные ссылки на `fetch_errno 'следуют ./posix-implementation.o: В функции `nosys_neg_one ': posix-creation.adb :(. text + 0xaef): неопределенная ссылка на `store_errno ' ./posix-implementation.o: В функции `notsup_neg_one ': posix-creation.adb :(. text + 0xb15): неопределенная ссылка на `store_errno ' ./posix-implementation.o: В функции `posix__implementation__restore_signals_and_raise_posix_error ': posix-creation.adb :(. text + 0xc88): неопределенная ссылка на `fetch_errno ' ./posix.o: В функции `posix__system_name ': posix.adb :(. text + 0x2f98): неопределенная ссылка на `__gnat_florist_uname ' ./posix.o: В функции `posix__node_name ': posix.adb :(. text + 0x2fef): неопределенная ссылка на `__gnat_florist_uname ' ./posix.o: В функции `posix__release ': posix.adb :(. text + 0x3049): неопределенная ссылка на `__gnat_florist_uname ' ./posix.o: В функции `posix__version ': posix.adb :(. text + 0x30a6): неопределенная ссылка на `__gnat_florist_uname ' ./posix.o: В функции `posix__machine ':posix.adb :(. text + 0x3103): неопределенная ссылка на `__gnat_florist_uname './posix.o: в функции` posix__host_to_network_byte_order': posix.adb :(. text + 0x4627): неопределенная ссылка на `c_htonl './posix.o: В функции `posix__host_to_network_byte_order__2 ': posix.adb :(. text + 0x4642): неопределенная ссылка на` 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): неопределенная ссылка на `c_ntohs './posix-io.o: в функции` posix__io__open': posix-io.adb :(. text + 0x4d1): неопределенная ссылка на `__gnat_florist_open './posix-io.o: в функции` posix__io__open_or_create': posix-io.adb :(. text + 0xfca): неопределенная ссылка на `__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 / include demo josh @ Mini10: ~ / Demo $ gnatlink demo ./posix-implementation.o: в функции `posix__implementation__set_ada_error_code': posix-creation.adb :(. text + 0x19e): неопределенная ссылка на `store_errno' ./posix-implementation.o: в функции` posix__implementation__get_ada_error_code ': posix-реализация.adb :(. text + 0x1ab): неопределенная ссылкаto `fetch_errno './posix-implementation.o: в функции` posix__implementation__raise_posix_error': posix-реализация.adb :(. text + 0x234): неопределенная ссылка на `fetch_errno './posix-implementation.o: в функции` posix__implementation__check__2: posix-creation.adb :(. text + 0x2e5): неопределенная ссылка на `fetch_errno './posix-implementation.o: в функции` posix__implementation__check__3': posix-реализация.adb :(. text + 0x313): неопределенная ссылка на`fetch_errno './posix-implementation.o: в функции` posix__implementation__check_nneg': posix-реализация.adb :(.text + 0x332): неопределенная ссылка на `fetch_errno './posix-implementation.o:posix-implementation.adb:(.text+0x34e): более неопределенные ссылки на` fetch_errno' следуют ./posix-implementation.o: в функции`nosys_neg_one ': posix-creation.adb :(. text + 0xaef): неопределенная ссылка на` store_errno' ./posix-implementation.o: в функции `notsup_neg_one ': posix-creation.adb :(. text + 0xb15):неопределенная ссылка на `store_errno './posix-implementation.o: в функции` posix__implementation__restore_signals_and_raise_posix_error': posix-реализация.adb :(. text + 0xc88): неопределенная ссылка на `fetch_errno './posix.o: в функции` posix__system: posix.adb :(. text + 0x2f98): неопределенная ссылка на `__gnat_florist_uname './posix.o: в функции` posix__node_name': posix.adb :(. text + 0x2fef): неопределенная ссылка на `__gnat_florist_uname './posix.o: В функции `posix__release ': posix.adb :(. text + 0x3049): неопределенная ссылка на` __gnat_florist_uname' ./posix.o: В функции `posix__version ': posix.adb :(. text + 0x30a6): неопределенная ссылка на `__gnat_florist_uname './posix.o: в функции` posix__machine': posix.adb :(. text + 0x3103): неопределенная ссылка на `__gnat_florist_uname './posix.o: В функции `posix__host_to_network_byte_order ': posix.adb :(. Text + 0x4627): неопределенная ссылка на` 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): неопределенная ссылка на `c_ntohl './posix.o: в функции` posix__network_to_host_byte_order__2': posix.adb:text + 0x4670): неопределенная ссылка на `c_ntohs './posix-io.o: в функции` posix__io__open': posix-io.adb :(. text + 0x4d1): неопределенная ссылка на `__gnat_florist_open './posix-io.o: В функции `posix__io__open_or_create ': posix-io.adb :(. text + 0xfca): неопределенная ссылка на` __gnat_florist_open' collect2: ld вернул 1 состояние выхода gnatlink: ошибка при вызове /usr/bin/gcc-4.4

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

Ответы [ 3 ]

6 голосов
/ 12 октября 2010

ОК, это оказалось большой болью, но я нашел это.

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

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

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, чтобы передать их в нужные места!

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

2 голосов
/ 13 октября 2010

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

Пример программы (я не смог найти простых демонстраций Florist в Интернете, есть ли?), В 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
1 голос
/ 11 октября 2010

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

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

...