2016-10-13 33 views
2

我想靜態鏈接我的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庫?

回答

1

經過一番麻煩,我找到了答案。

事實證明,-m32mscoff是重要的,它是32位所必需的。按原樣編譯和鏈接64位工作。

添加到dub.json

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

即使dub通過-m32dmd,它是一個的需要-m32mscoff。正常情況下,您現在可以鏈接cl