标签: dmd

D编程语言的文件I/O.

我正在尝试遵循一个简单的教程,无法使用以下代码:

void main(string args[])
{
  auto f = File("test.txt", "w");
  f.writeln("Hello, Worlds!");
}
Run Code Online (Sandbox Code Playgroud)

我在Windows上使用dmd编译器.

d dmd

3
推荐指数
1
解决办法
1587
查看次数

我应该确保我的代码与DMD和GDC一起编译吗?

我想部分等价的问题:编译的代码是否应该与DMD一起编译,在GDC的所有情况下自动编译?

我问,因为我在从ubuntu 10.4(看似循环的依赖,叹息)转发中安装现代版本的GDC时遇到了问题.

d dmd gdc

3
推荐指数
1
解决办法
312
查看次数

如何为rdmd(Windows)设置输出目录?

我知道,在dmd中可以这样做:

> cd ..\bin
> dmd ..\src\example.d
Run Code Online (Sandbox Code Playgroud)

或者像这样:

> dmd example.d -offilename ..\bin\example.exe
Run Code Online (Sandbox Code Playgroud)

但是在rdmd中这种方法不起作用.文件"example.exe"始终与"example.d"出现在同一文件夹中.

我试着这样做

> rdmd --build-only example.d ..\bin\example.exe
Run Code Online (Sandbox Code Playgroud)

, 这个

> rdmd --build-only example.d -offilename ..\bin\example.exe
Run Code Online (Sandbox Code Playgroud)

还有这个

> cd ..\bin && rdmd --build-only ..\src\example.d
Run Code Online (Sandbox Code Playgroud)

具有相同的否定结果.

d dmd

3
推荐指数
1
解决办法
218
查看次数

在64位Linux上使用DMD进行编译或使用32位目标文件进行链接

在64位机器上使用DMD编译程序的最佳方法是什么?它不需要编译为64位代码.我知道GDC,但也希望与D2合作.还有chroot,但我希望有一个更简单的方法.

实际问题不在于编译,而在于链接.DMD调用GCC来执行与系统库的链接.我可以让DMD与32位库进行GCC链接吗?或者我该如何手动完成?

我已经安装了ia32库,这就是我可以运行DMD的原因.

64-bit linker 32-bit d dmd

2
推荐指数
1
解决办法
1928
查看次数

D opBinary()()重载错误?

当我尝试在一个简单的Vector结构上重载opBinary时,我得到一个奇怪且毫无意义的错误:

struct Vector(T)
{
    T x, y;

    Vector opBinary(string op)(Vector!float vector)
    {
        return Vector (
            mixin("x" ~ op ~ "vector.x"),
            mixin("y" ~ op ~ "vector.y")
        );
    }

    Vector opBinary(string op)(Vector!double vector)
    {
        return Vector (
            mixin("x" ~ op ~ "vector.x"),
            mixin("y" ~ op ~ "vector.y")
        );
    }
}

void main()
{
    auto dVec = Vector!double();
    auto fVec = Vector!float();

    auto aVec = dVec + fVec; // Adding this line causes error (see below)
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误很简单:"opBinary(string op)".没有行号,没有.这显然不会给我很多东西继续下去.还有另一种方法来处理这种情况吗?这是一个已知的错误?

我在Windows 7上使用DMD 2.057.还没有在Linux上测试过.

[编辑]清理了一些代码以提高可读性.

overloading d operator-overloading dmd

2
推荐指数
1
解决办法
178
查看次数

contract.d无法读取

我最近从dmd.2.060.zip解压缩了子窗口和src .然后我尝试import std.contracts;但编译器不喜欢它:

Error: module contracts is in file 'std\contracts.d' which cannot be read
Run Code Online (Sandbox Code Playgroud)

我手动找不到文件.什么坏了?

contract.d被另一个文件替换了吗?

也许我必须在使用前编译一些东西?

d dmd

2
推荐指数
1
解决办法
514
查看次数

D编译器DMD不链接目标文件

我有一个名为"dprogram.d"的源文件,并在mac osx的终端中使用命令$ dmd dprogram.d来创建可执行文件.根据官方文档,编译器将自动编译源并链接.o目标文件(http://dlang.org/dmd-linux.html#linking),但它似乎没有这样做.

编译器将创建一个.o文件但不是可执行文件,我从终端获得的唯一反馈是一条消息:"gcc:no such file or directory",好像gcc尝试链接目标文件但无法找到它.

使用mac osx上的dmd(数字mars D)编译器编译.d源的正确方法是什么?

(编辑:在Windows上它确实有效,它自动创建.exe但在mac osx上它没有)

compiler-construction macos linker d dmd

2
推荐指数
1
解决办法
379
查看次数

调试DMD通过GDB生成程序

我正在尝试使用D编译调试我的第一个程序

dmd -debug hello.d
Run Code Online (Sandbox Code Playgroud)

但是当我通过GDB-7.6运行可执行文件时,它似乎不知道在哪里找到源代码并解码堆栈跟踪的格式(及其名称 - 解码).

是否GDB调试DMD生成的可执行文件尚未得到支持或者我错过了什么?

gdb d stack-trace dmd demangler

2
推荐指数
1
解决办法
1425
查看次数

触发"分段错误"的超奇怪问题

我不会深入研究这个问题(代码库已经有数千行而且非常复杂),所以我会尝试将..."窗口"缩小到我发现的位置.

这是触发"分段错误"的例程:

extern (C) 
{
    void* Statements_new() { return cast(void*)(new Statements()); }
    void  Statements_add(Statements s, Statement st) 
    { 
        //writeln("In here"); 
        if (s is null) writeln("StatemenTS are null"); 
        else writeln("not null : "~ typeid(s).name); 

        if (st is null) writeln("statement is null"); 
        else writeln("not null : " ~ typeid(st).name); 

        s.add(st); 

        //writeln("Out of here"); 

    }

} 
Run Code Online (Sandbox Code Playgroud)

几点说明:

  • 声明的方法只是"绑定",因此可以直接从C代码(实际上是Bison)调用本机例程.
  • Statements_add使用Statements对象和子类Statement对象调用该函数.

现在,它的奇怪之处:

  • 错误并不是一直发生的(实际上它不会像99%的时间那样发生),但是当它发生时,该s.add(st);声明似乎是罪魁祸首.
  • 永远不会是2个参数之一(s,st)null.
  • 现在,如果我评论2个if... writeln... typeid语句,那么错误就在那里.
  • 如果我取消注释它们(它们什么都不做,是吗?),它总是有效 - 固定 …

c d dmd

2
推荐指数
1
解决办法
130
查看次数

如何正确从 D 接口到 C++?

我尝试在 C++ 和 D 之间建立接口。

\n

问题是我无法编译它。我使用了网站上的代码/命令行

\n
> g++ -c foo.cpp\n> dmd bar.d foo.o -L-lstdc++ && ./bar\n
Run Code Online (Sandbox Code Playgroud)\n

它不起作用:首先,DMD编译器不使用.o文件,所以我必须手动指定创建.obj文件,然后链接器抛出错误,因为它不知道/lstdc++,所以我配置了手动编译 cpp 库。

\n

这就是我现在遇到的问题,它抛出“找不到符号”错误,我不知道如何解决这个问题,我在编译时做错了什么吗?或者是在编程网站上?

\n

这是我的编译命令:

\n
PS C:\\Users\\kunde\\Downloads\\d-interface test> g++ -c -o test-cpp.obj test.cpp\nPS C:\\Users\\kunde\\Downloads\\d-interface test> dmd -L"G:\\GNUstep\\lib\\gcc\\mingw32\\4.6.1\\libstdc++.dll.a" -L"G:\\GNUstep\\lib\\gcc\\mingw32\\4.6.1\\libstdc++.a" .\\test-cpp.obj .\\test.d\ntest.obj : error LNK2019: Verweis auf nicht aufgel\xc3\xb6stes externes Symbol ""char __cdecl foo(int)" (?foo@@YADH@Z)" in Funktion "__Dmain".\ntest-cpp.exe : fatal error LNK1120: 1 nicht aufgel\xc3\xb6ste Externe\nError: linker exited with status 1120\n
Run Code Online (Sandbox Code Playgroud)\n

和我的代码:\ntest.d:

\n
import std.stdio;\n\nextern (C++) char foo(int i);\n\nvoid …
Run Code Online (Sandbox Code Playgroud)

c++ gcc d dmd interfacing

2
推荐指数
1
解决办法
239
查看次数