2

D ライブラリ (ダブを使用) を C++ アプリに静的にリンクしたいと考えています。

wiki の指示に従って、例を手動で正常にリンクしました。

しかし、ダブを使用する独自のライブラリがあり、cl.


私が何を意味するかをお見せしましょう ( 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また、 flags-m32mscoffdub.json に-betterC対応する設定がないことにも気付きました。とはいえ、補償の仕方がわかりません。buildOptions

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

dub を使用する D ライブラリを C++ アプリと静的にリンクするにはどうすればよいですか?

4

1 に答える 1