Вызов функций C / C ++ в динамических и статических библиотеках в D - PullRequest
5 голосов
/ 31 мая 2011

У меня возникают проблемы, когда я не могу понять, как взаимодействовать с библиотеками C / C ++, как статическими (.lib / .a), так и динамическими (.dll / .so), в D. Из того, что я понимаю, это возможно сообщить компилятору DMD о связывании с .lib-файлами и о том, что вы можете конвертировать .dll-файлы в .lib с помощью инструмента implib, предоставляемого Digital Mars. Кроме того, я сталкивался с этой страницей , которая подразумевает возможность вызова функций в .dll путем преобразования заголовочных файлов C в файлы интерфейса D. Оба эти метода эквивалентны? Будут ли эти методы работать с файлами библиотеки Unix? Кроме того, как можно ссылаться на функции, перечисления и т. Д. Из этих библиотек, и как можно сказать их компилятору D связываться с этими библиотеками (я использую VisualD, в частности)? Если бы кто-нибудь мог привести несколько примеров ссылок на файлы .lib, .dll, .a и .so из кода D, я был бы очень признателен.

Ответы [ 2 ]

5 голосов
/ 01 июня 2011

Обратите внимание, что вы имеете дело с тремя этапами создания исполняемого файла.Во время компиляции вы создаете объектные файлы (.lib / .a - это просто архивы объектных файлов).После того, как эти файлы созданы, вы используете компоновщик, чтобы собрать все части вместе.При работе с динамическими библиотеками (.dll, .so) есть дополнительный шаг загрузки библиотеки, когда программа запускается / во время выполнения.

Во время компиляции компилятору нужно только знать, кто вы.используя, это не волнует, если это реализовано.Это где файлы интерфейса D входят и являются своего рода эквивалентными заголовочными файлами в этом отношении.Перечисления объявляются в файле интерфейса D и также должны быть определены, поскольку они существуют только во время компиляции.Функции и переменные могут быть объявлены без тела.

int myFunction(char* str);

Руководство по преобразованию файла заголовка в D находится на странице, на которую вы ссылаетесь.Затем эти файлы могут быть переданы компилятору или существовать во включенном пути.

Когда компоновщик запускается, когда вам нужен файл .lib / .a.Эти файлы могут быть переданы компилятору, который перенаправит их компоновщику, или вы можете использовать прагму (lib, "my.lib");в вашей программе.В обоих случаях компоновщик должен быть в состоянии найти его во время компиляции (компиляция).

В Linux я не верю, что существует разница между динамическими и статическими связями.В Windows вам даже не нужен файл интерфейса D.Вместо этого вы должны получить функцию через системные вызовы.Я действительно не очень знаком с этой областью, но я предлагаю Загрузка плагинов (DLL) на лету

Обновление: я не могу помочь с VisualD, но есть D для программистов .NET .

1 голос
/ 31 мая 2011

Есть образцы в D, как это сделать.

Вам нужно определить модуль thunk следующим образом:

module harmonia.native.win32;
version(build) { pragma(nolink); }

export int DialogBoxParamA(HINSTANCE hInstance, LPCSTR lpTemplateName,
  HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam);

и включают импортные библиотеки DLL, в которых определены такие функции, как DialogBoxParamA.

...