d — использовать dub для вывода статической библиотеки C ++ с возможностью связи

Я хочу статически связать мою библиотеку 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 ++?

2

Решение

После некоторых неприятностей я понял это.

Оказывается, -m32mscoff важно, и это требуется для 32-битной. Компиляция и компоновка для 64-битной версии работает нормально как есть.

Добавить в dub.json:

"dflags-windows-x86-dmd": [
"-m32mscoff"]

Даже если dub проходит -m32 в dmd, его -m32mscoff это нужно Теперь вы можете связаться с cl как обычно.

1

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

Других решений пока нет …

По вопросам рекламы [email protected]