#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
как обычно.