Используйте dub для вывода статической библиотеки с привязкой к C

#c #d #static-linking #dub

#c #d #статическое связывание #dub

Вопрос:

Я хочу статически связать свою общую библиотеку (которая использует dub) с моим приложением на C .

Я следовал инструкциям в вики, чтобы успешно вручную связать пример.

Но у меня есть своя собственная библиотека, которая использует dub, и я не могу понять, как заставить ее выводить то, на что я ссылаюсь, используя cl .


Позвольте мне показать вам, что я имею в виду (пример кода из вики, но с добавлением dub):

Каталог проекта:

 E:Projectsfoo
│   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: %in", result);

    return 0;
}
 

libadd/dub.json:

 {
    "name": "libadd",
    "targetType": "staticLibrary",
    "mainSourceFile": "libadd.d",
    "buildOptions": [
        "verbose"
    ]
}
 

libadd/source/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() {}
 

Компиляция и компоновка с использованием инструкций из wiki работает нормально:

 e:Projectsfoo> dmd -c -v -m32mscoff -betterC libadd/source/libadd.d
binary    C:optDdmd2windowsbindmd.exe
version   v2.071.1
config    C:optDdmd2windowsbinsc.ini
parse     libadd
importall libadd
import    object        (C:optDdmd2windowsbin....srcdruntimeimportobject.d)
semantic  libadd
semantic2 libadd
semantic3 libadd
code      libadd
function  libadd.add
function  libadd._d_dso_registry

e:Projectsfoo> cl /nologo /Fefoo.exe main.c libadd.obj
main.c

e:Projectsfoo> foo.exe
The result is: 42
 

Но как мне сделать это с помощью dub? Я заметил, что при ручной компиляции с dmd помощью выдает an .obj , dub создает an .lib . По словам профессора Google, .lib это статическая библиотека в Windows, но я не могу на нее ссылаться. Я уже установил targetType значение staticLibrary in dub.json .

Я также заметил, что dmd флаги -m32mscoff и -betterC не имеют соответствующей buildOptions настройки в dub.json. Однако я не уверен, как это компенсировать.

 e:Projectsfoo> cd libadd

e:Projectsfoolibadd> dub
Performing "debug" build using dmd for x86.
libadd ~master: building configuration "library"...
binary    C:optDdmd2windowsbindmd.exe
version   v2.071.1
config    C:optDdmd2windowsbinsc.ini
parse     libadd
importall libadd
import    object        (C:optDdmd2windowsbin....srcdruntimeimportobject.d)
semantic  libadd
semantic2 libadd
semantic3 libadd
code      libadd
function  libadd.add
function  libadd._d_dso_registry
library   .dubbuildlibrary-debug-windows-x86-dmd_2071-2DA862E35C1BEDC80780CBC1AB5F7478libadd.lib
Target is a library. Skipping execution.

e:Projectsfoolibadd> cd ..

e:Projectsfoo> cl /nologo /Fefoo.exe main.c libadd/libadd.lib
main.c
libadd/libadd.lib : fatal error LNK1136: invalid or corrupt file
 

Как статически связать мою общую библиотеку, использующую dub, с приложением на C ?

Ответ №1:

После некоторых проблем я понял это.

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

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

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

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