2016-10-13 10 views
2

私のCライブラリにダブを使っているDライブラリを静的にリンクしたいと思います。ダブを使って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() {} 

のコンパイルとWikiからの命令を使用してリンクが正常に動作します:

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上の静的ライブラリですが、私はそれにリンクすることはできません。私はすでにtargetTypestaticLibraryに設定してdub.jsonに設定しました。

私もdmdフラグ-m32mscoff-betterCは何buildOptionssetting in dub.jsonに対応していることに気づいていません。しかし、私はどのように補償するか分からない。私は静的にC++アプリで、ダブを使用して、私のDライブラリをリンクするにはどうすればよい

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 

答えて

1

私はそれを理解しました。

これは、-m32mscoffが重要であることが判明しました。これは32ビットに必要です。 64ビット版のコンパイルとリンクは、そのままの状態で動作します。

dub.jsonに追加:

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

dubはそれが必要なの-m32mscoffだ、dmdから-m32を渡していますが。通常はclとリンクすることができます。

関連する問題