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");
в ваш основной исходный файл.