使用dub输出C++可链接静态库
Use dub to output C++ linkable static library
我想静态 link 我的 D 库(使用 dub)和我的 C++ 应用程序。
我已经按照 the instructions on the wiki 成功地手动 link 这个例子。
但是,我有自己的使用 dub 的库,我不知道如何让它输出我 link 使用 cl
.
的东西
让我告诉你我的意思(示例代码 from the wiki,但添加了配音):
项目目录:
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/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 中的说明进行编译和 linking 工作正常:
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 上的静态库,但我无法 link 访问它。我已经在 dub.json
.
中将 targetType
设置为 staticLibrary
我还注意到 dmd
标志 -m32mscoff
和 -betterC
没有相应的 buildOptions
setting in dub.json。不过,我不确定如何补偿。
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
如何静态 link 使用 dub 的 D 库和 C++ 应用程序?
经过一番努力我弄明白了。
事实证明,-m32mscoff
很重要,它是 32 位所必需的。为 64 位编译和 linking 工作正常。
加入dub.json
:
"dflags-windows-x86-dmd": [
"-m32mscoff"
]
即使 dub
将 -m32
传递给 dmd
,也需要 -m32mscoff
。您现在可以 link 和 cl
正常。
我想静态 link 我的 D 库(使用 dub)和我的 C++ 应用程序。
我已经按照 the instructions on the wiki 成功地手动 link 这个例子。
但是,我有自己的使用 dub 的库,我不知道如何让它输出我 link 使用 cl
.
让我告诉你我的意思(示例代码 from the wiki,但添加了配音):
项目目录:
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/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 中的说明进行编译和 linking 工作正常:
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 上的静态库,但我无法 link 访问它。我已经在 dub.json
.
targetType
设置为 staticLibrary
我还注意到 dmd
标志 -m32mscoff
和 -betterC
没有相应的 buildOptions
setting in dub.json。不过,我不确定如何补偿。
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
如何静态 link 使用 dub 的 D 库和 C++ 应用程序?
经过一番努力我弄明白了。
事实证明,-m32mscoff
很重要,它是 32 位所必需的。为 64 位编译和 linking 工作正常。
加入dub.json
:
"dflags-windows-x86-dmd": [
"-m32mscoff"
]
即使 dub
将 -m32
传递给 dmd
,也需要 -m32mscoff
。您现在可以 link 和 cl
正常。