【问题标题】:Use dub to output C++ linkable static library使用 dub 输出 C++ 可链接静态库
【发布时间】:2016-10-13 20:52:25
【问题描述】:

我想将我的 D 库(使用 dub)与我的 C++ 应用程序静态链接。

我已经关注the instructions on the wiki成功手动链接示例。

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


让我告诉你我的意思(示例代码from the wiki,但添加了配音):

项目目录:

E:\Projects\foo
│   main.c
│
└───libadd
    │   dub.json
    │   libadd.lib
    │
    └───source
            main.d

ma​​in.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/source/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 上的静态库,但我无法链接到它。我已经在dub.json 中将targetType 设置为staticLibrary

我还注意到dmd 标志-m32mscoff-betterC 没有对应的buildOptions setting 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

如何将使用 dub 的 D 库与 C++ 应用程序静态链接?

【问题讨论】:

    标签: c++ d static-linking dub


    【解决方案1】:

    经过一番麻烦,我想通了。

    事实证明,-m32mscoff 很重要,它是 32 位所必需的。 64 位的编译和链接工作正常。

    加入dub.json:

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

    尽管dub-m32 传递给dmd,但还是需要-m32mscoff。您现在可以正常链接cl

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-17
      • 2014-08-20
      • 1970-01-01
      • 2014-03-24
      相关资源
      最近更新 更多