Я хочу статически связать мою библиотеку D (которая использует dub) с моим приложением C ++.
Я следовал инструкции в вики успешно вручную связать пример.
Но у меня есть собственная библиотека, которая использует dub, и я не могу понять, как заставить ее выводить то, на что я ссылаюсь, используя cl
,
Позвольте мне показать вам, что я имею в виду (пример кода из вики, но с добавленным дабом)
Каталог проекта:
E:\Projects\foo
│ main.c
│
└───libadd
│ dub.json
│ libadd.lib
│
└───source
main.d
main.c:
#include <stdio.h>
// Defined in dlib.d
int add(int, int);
int main(int argc, char ** argv) {
int result = add(40, 2);
printf("The result is: %i\n", result);
return 0;
}
libadd / dub.json:
{
"name": "libadd",
"targetType": "staticLibrary",
"mainSourceFile": "libadd.d",
"buildOptions": [
"verbose"]
}
libadd / источник / libadd.d:
module libadd;
extern (C) int add(int a, int b) {
return a + b;
}
// Only needed on Linux.
extern (C) void _d_dso_registry() {}
Компиляция и компоновка с использованием инструкций из вики работает нормально:
e:\Projects\foo> dmd -c -v -m32mscoff -betterC libadd/source/libadd.d
binary C:\opt\D\dmd2\windows\bin\dmd.exe
version v2.071.1
config C:\opt\D\dmd2\windows\bin\sc.ini
parse libadd
importall libadd
import object (C:\opt\D\dmd2\windows\bin\..\..\src\druntime\import\object.d)
semantic libadd
semantic2 libadd
semantic3 libadd
code libadd
function libadd.add
function libadd._d_dso_registry
e:\Projects\foo> cl /nologo /Fefoo.exe main.c libadd.obj
main.c
e:\Projects\foo> foo.exe
The result is: 42
Но как мне сделать это с даб? Я заметил, что во время ручной компиляции с dmd
производит .obj
, dub
производит .lib
, По словам профессора Google, .lib
это статическая библиотека в Windows, но я не могу на нее ссылаться. Я уже поставил targetType
в staticLibrary
в dub.json
,
Я также заметил, что dmd
флаги -m32mscoff
а также -betterC
не соответствует buildOptions
настройка в дубляже. Я не уверен, как компенсировать, хотя.
e:\Projects\foo> cd libadd
e:\Projects\foo\libadd> dub
Performing "debug" build using dmd for x86.
libadd ~master: building configuration "library"...
binary C:\opt\D\dmd2\windows\bin\dmd.exe
version v2.071.1
config C:\opt\D\dmd2\windows\bin\sc.ini
parse libadd
importall libadd
import object (C:\opt\D\dmd2\windows\bin\..\..\src\druntime\import\object.d)
semantic libadd
semantic2 libadd
semantic3 libadd
code libadd
function libadd.add
function libadd._d_dso_registry
library .dub\build\library-debug-windows-x86-dmd_2071-2DA862E35C1BEDC80780CBC1AB5F7478\libadd.lib
Target is a library. Skipping execution.
e:\Projects\foo\libadd> cd ..
e:\Projects\foo> cl /nologo /Fefoo.exe main.c libadd/libadd.lib
main.c
libadd/libadd.lib : fatal error LNK1136: invalid or corrupt file
Как статически связать мою библиотеку D, которая использует dub, с приложением C ++?
После некоторых неприятностей я понял это.
Оказывается, -m32mscoff
важно, и это требуется для 32-битной. Компиляция и компоновка для 64-битной версии работает нормально как есть.
Добавить в dub.json
:
"dflags-windows-x86-dmd": [
"-m32mscoff"]
Даже если dub
проходит -m32
в dmd
, его -m32mscoff
это нужно Теперь вы можете связаться с cl
как обычно.
Других решений пока нет …