Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用dub输出C++;可链接静态库 我想静态链接我的D库(使用DUB)和我的C++应用程序。_C++_D_Static Linking_Dub - Fatal编程技术网

使用dub输出C++;可链接静态库 我想静态链接我的D库(使用DUB)和我的C++应用程序。

使用dub输出C++;可链接静态库 我想静态链接我的D库(使用DUB)和我的C++应用程序。,c++,d,static-linking,dub,C++,D,Static Linking,Dub,我已经成功地手动链接了这个示例 但是,我有自己的库,它使用dub,我不知道如何让它输出我使用cl链接到的内容 让我向您展示我的意思(示例代码,但添加了dub): 项目目录: E:\Projects\foo │ main.c │ └───libadd │ dub.json │ libadd.lib │ └───source main.d #include <stdio.h> // Defined in dlib.

我已经成功地手动链接了这个示例

但是,我有自己的库,它使用dub,我不知道如何让它输出我使用
cl
链接到的内容


让我向您展示我的意思(示例代码,但添加了dub):

项目目录:

E:\Projects\foo
│   main.c
│
└───libadd
    │   dub.json
    │   libadd.lib
    │
    └───source
            main.d
#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;
}
{
    "name": "libadd",
    "targetType": "staticLibrary",
    "mainSourceFile": "libadd.d",
    "buildOptions": [
        "verbose"
    ]
}
module libadd;

extern (C) int add(int a, int b) {
    return a + b;
}

// Only needed on Linux.
extern (C) void _d_dso_registry() {}
main.c:

E:\Projects\foo
│   main.c
│
└───libadd
    │   dub.json
    │   libadd.lib
    │
    └───source
            main.d
#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;
}
{
    "name": "libadd",
    "targetType": "staticLibrary",
    "mainSourceFile": "libadd.d",
    "buildOptions": [
        "verbose"
    ]
}
module libadd;

extern (C) int add(int a, int b) {
    return a + b;
}

// Only needed on Linux.
extern (C) void _d_dso_registry() {}
libadd/source/libadd.d:

E:\Projects\foo
│   main.c
│
└───libadd
    │   dub.json
    │   libadd.lib
    │
    └───source
            main.d
#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;
}
{
    "name": "libadd",
    "targetType": "staticLibrary",
    "mainSourceFile": "libadd.d",
    "buildOptions": [
        "verbose"
    ]
}
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
但我该如何处理dub?我注意到,当使用
dmd
手动编译时,会生成
.obj
dub
生成
.lib
。根据谷歌教授的说法,
.lib
是Windows上的一个静态库,但我无法链接到它。我已经在
dub.json
中将
targetType
设置为
staticLibrary

我还注意到
dmd
标志
-m32mscoff
-betterC
没有相应的
构建选项。不过,我不知道如何补偿

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++ APP?< /P> < P>经过一些麻烦后我想出来了。 事实证明,
-m32mscoff
很重要,并且它是32位所必需的。64位的编译和链接工作正常

添加到
dub.json

"dflags-windows-x86-dmd": [
    "-m32mscoff"
]
即使
dub
-m32
传递给
dmd
,也需要
-m32mscoff
。您现在可以像往常一样链接到
cl