D: Как использовать привязку к C++ lib с D?

Я нашел очень необходимое для моей привязки к lib с именем GDAL. https://github.com/craig-dillabaugh/gdal

Проблема в том, что нет примеров его использования. Раньше я никогда не использовал привязки.

dub.json включает следующую строку:"libs" : ["gdal"]

Так что, похоже, нужен файл lib с таким именем.

В старых коммитах я нашел пример компиляции без дублирования: dmd test_gdal_d.d gdal.d -L-ldgal

Оригинальный дистрибутив gdal не включает lib с таким именем. Есть только gdal111.dll Lib. Так что я преобразовал это с implib в gdal111.lib, С командой implib /s gdal111.lib gdal111.dll

Из 11 МБ размер файла становится 1 МБ.

С Dependency Walker я просмотрел таблицу символов. Это есть символы, такие как GDALGetRasterXSizeЯ пытаюсь собрать все с помощью следующей команды:

dmd D:\code\binding\gdal-master\gdal-master\source\App.d D:\code\binding\gdal-master\gdal-master\source\gdal.d -L -Igdal111.lib

но я получаю следующую ошибку:

D:\code\binding\gdal-master\gdal-master>dmd D:\code\binding\gdal-master\gdal-master\source\App.d D:\code\binding\gdal-master\gdal-master\source\gdal.d -L -Igdal111.lib OPTLINK (R) for Win32 Release 8.00.17 Copyright (C) Digital Mars 1989-2013 All rights reserved. http://www.digitalmars.com/ctg/optlink.html App.obj(App) Error 42: Symbol Undefined _GDALClose App.obj(App) Error 42: Symbol Undefined _GDALGetRasterCount App.obj(App) Error 42: Symbol Undefined _GDALGetRasterXSize App.obj(App) Error 42: Symbol Undefined _GDALGetRasterYSize App.obj(App) Error 42: Symbol Undefined _GDALOpen App.obj(App) Error 42: Symbol Undefined _GDALAllRegister App.obj(App) Error 42: Symbol Undefined _GDALIdentifyDriver App.obj(App) Error 42: Symbol Undefined _GDALCreate --- errorlevel 8

Я положил архив со всеми вещами здесь http://dlang.ru/gdal-d-binding.zip

UPD: у меня прогон GDAL!!!

Я хочу добавить строку:pragma( lib, "libgdal.lib" ); на пример, и он запускается. В скором времени я надеюсь добавить код на github.

1 ответ

Составляя решение, которое мы собрали из комментариев здесь:

Во-первых, вам нужно сделать файл lib. implib можно скачать здесь ftp.digitalmars.com/bup.zip и просто запустить его на dll, implib /s ldgal.lib ldgal.dll создать библиотеку импорта.

Как только это будет сделано, вам нужно добавить его в сборку. Есть два способа сделать это: добавить ldgal.lib в конец командной строки для dmd (без каких-либо других ключей просто добавьте файл, dmd увидит, что это.lib и сделает правильные вещи) или добавьте pragma(lib, "ldgal"); в ваш основной исходный файл.

Другие вопросы по тегам