私の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上の静的ライブラリですが、私はそれにリンクすることはできません。私はすでにtargetType
をstaticLibrary
に設定してdub.json
に設定しました。
私もdmd
フラグ-m32mscoff
と-betterC
は何buildOptions
setting 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
?