gnat gprbuild: как создать динамическую dll и ссылку на статическую библиотеку c ++

У меня есть полный проект Ada, который я хочу построить, чтобы получить динамическую DLL.
Поэтому я должен связать его с другой статической библиотекой (myanotherlibrary.lib).

Я использую эту командную строку:

gprbuild -d "D:\My_grp_project\My_grp_project.gpr"

Вот содержание .gpr:

project My_grp_project is

Architecture := "x86";

for Languages use ("Ada");
for Source_Dirs use (".", "source", "source\common");
for Library_Dir use "dll\" & Architecture;
for Library_Ali_Dir use "ali\" & Architecture;
for Library_Name use "My_grp_project";
for Library_Kind use "dynamic";
for Object_Dir use "obj\" & Architecture;

package Linker is
for Default_Switches ("Ada") use ("-L.", "-lbar");
end Linker;

end My_grp_project;

Я поместил «myanotherlibrary.lib» в каталог «D: \ My_grp_project \», но он по-прежнему не ссылается: «неопределенная ссылка на …»

Может ли кто-нибудь помочь мне, пожалуйста?

С уважением
лощина

1

Решение

Глядя на документы, Я думаю, что вы должны использовать Library_Options атрибут вместо package Linker:

for Library_Options use ("-L.", "-lbar”);

(Я запутался — ты имеешь в виду myanotherlibrary.lib или же bar.lib?)

Я был бы немного обеспокоен использованием статической библиотеки из динамической библиотеки: я ожидал, что динамическая библиотека будет построена с -fPIC или эквивалентный ключ для получения позиционно-независимого кода, чтобы один и тот же загруженный двоичный файл библиотеки можно было видеть по разным адресам в каждом из исполняемых файлов, использующих его.

2

Другие решения

Вот решение, которое я наконец нашел.

  1. Невозможно связать статическую библиотеку, скомпилированную с MSVC. Мне пришлось скомпилировать мою статическую библиотеку с помощью GCC (той же версии, что и в GNAT).
  2. Мне пришлось добавить опции «Library_Options», без аргументов «-L» и «-l» (еще одна проблема, которую я передал). Обратите внимание, что пакет Linker не учитывается при создании динамической библиотеки. Обратите внимание, что пути не должны быть пробелами!
Проект My_grp_project является

для использования языков («Ада»);
для использования Source_Dirs (".", "source", "source \ common");
для Library_Dir используйте «dll»;
для Library_Ali_Dir используйте «ali»;
для Object_Dir используйте «obj»;

для Library_Name используйте «My_grp_project»;
для Library_Kind используйте «dynamic»;
для использования Library_Options ("path \ myanotherlibrary.a", "path_to_GNAT \ libstdc ++. a");

end My_grp_project;
  1. Я встроил проект в GPS (опция по умолчанию): «Build All»
  2. В результате у меня есть моя динамическая библиотека «libMy_grp_project.dll»

Вуаля.
Спасибо !

0