使用配音输出C++可链接静态库

问题描述:

我想静态链接我的D库(使用配音)与我的C++应用程序。使用配音输出C++可链接静态库

我跟着the instructions on the wiki成功手动链接示例。

但是,我有我自己的库,使用配音,我不知道如何使其输出的东西我链接到使用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 /源极/ 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没有相应的buildOptionssetting 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 

如何静态链接使用配音,用C++应用程序我的d库?

经过一番麻烦,我找到了答案。

事实证明,-m32mscoff是重要的,它是32位所必需的。按原样编译和链接64位工作。

添加到dub.json

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

即使dub通过-m32dmd,它是一个的需要-m32mscoff。正常情况下,您现在可以链接cl