我正在尝试遵循一个简单的教程,无法使用以下代码:
void main(string args[])
{
auto f = File("test.txt", "w");
f.writeln("Hello, Worlds!");
}
Run Code Online (Sandbox Code Playgroud)
我在Windows上使用dmd编译器.
我想部分等价的问题:编译的代码是否应该与DMD一起编译,在GDC的所有情况下自动编译?
我问,因为我在从ubuntu 10.4(看似循环的依赖,叹息)转发中安装现代版本的GDC时遇到了问题.
我知道,在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)
具有相同的否定结果.
在64位机器上使用DMD编译程序的最佳方法是什么?它不需要编译为64位代码.我知道GDC,但也希望与D2合作.还有chroot,但我希望有一个更简单的方法.
实际问题不在于编译,而在于链接.DMD调用GCC来执行与系统库的链接.我可以让DMD与32位库进行GCC链接吗?或者我该如何手动完成?
我已经安装了ia32库,这就是我可以运行DMD的原因.
当我尝试在一个简单的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上测试过.
[编辑]清理了一些代码以提高可读性.
我最近从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被另一个文件替换了吗?
也许我必须在使用前编译一些东西?
我有一个名为"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上它没有)
我正在尝试使用D编译调试我的第一个程序
dmd -debug hello.d
Run Code Online (Sandbox Code Playgroud)
但是当我通过GDB-7.6运行可执行文件时,它似乎不知道在哪里找到源代码并解码堆栈跟踪的格式(及其名称 - 解码).
是否GDB调试DMD生成的可执行文件尚未得到支持或者我错过了什么?
我不会深入研究这个问题(代码库已经有数千行而且非常复杂),所以我会尝试将..."窗口"缩小到我发现的位置.
这是触发"分段错误"的例程:
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)
几点说明:
Statements_add
使用Statements
对象和子类Statement
对象调用该函数.现在,它的奇怪之处:
s.add(st);
声明似乎是罪魁祸首.s
,st
)null
.if... writeln... typeid
语句,那么错误就在那里.我尝试在 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这是我的编译命令:
\nPS 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:
\nimport std.stdio;\n\nextern (C++) char foo(int i);\n\nvoid …
Run Code Online (Sandbox Code Playgroud) d ×10
dmd ×10
linker ×2
32-bit ×1
64-bit ×1
c ×1
c++ ×1
demangler ×1
gcc ×1
gdb ×1
gdc ×1
interfacing ×1
macos ×1
overloading ×1
stack-trace ×1