我是gtk编程和d的新手,并使用gtkd源代码进行学习。当我尝试编译下面的代码[我在archlinux上使用dmd-2.060和gtkd-2.0]。
/*
Modified sourceview demo for learning gtk programming in d
*/
pragma(lib, "gtkd");
pragma(lib, "gtkdsv");
pragma(lib, "dl");
import gtk.MainWindow;
import gtk.Main;
import gtk.Widget;
//import gtk.TextView;
import gsv.SourceView;
import std.stdio;
import std.file;
/**
* Demos for SourceView.
* TODO on gsv: override methods from TextView, TextBuffer, etc
*/
class HelloWorld : MainWindow
{
SourceView sourceView;
//TextView textView;
this()
{
super("GtkD SourceView");
setBorderWidth(10);
add(getSourceView());
setDefaultSize(640,400);
showAll();
}
private Widget getSourceView()
{
sourceView = new SourceView();
return sourceView;
//textView = new TextView();
//return textView;
}
}
void main(string[] args)
{
Main.init(args);
new HelloWorld();
Main.run();
}
我收到这样的错误
/usr/lib/libgtkdsv.a(SourceCompletionInfo.o):(.data+0x140): undefined reference to `_D3gtk8TextView12__ModuleInfoZ'
/usr/lib/libgtkdsv.a(SourceGutterRenderer.o):(.data+0xe8): undefined reference to `_D3gtk8TextView12__ModuleInfoZ'
/usr/lib/libgtkdsv.a(SourceGutterRenderer.o): In function `_D3gsv20SourceGutterRenderer20SourceGutterRenderer7getViewMFZC3gtk8TextView8TextView':
(.text._D3gsv20SourceGutterRenderer20SourceGutterRenderer7getViewMFZC3gtk8TextView8TextView+0x7e): undefined reference to `_D3gtk8TextView8TextView7__ClassZ'
/usr/lib/libgtkdsv.a(SourceGutterRenderer.o): In function `_D3gsv20SourceGutterRenderer20SourceGutterRenderer7getViewMFZC3gtk8TextView8TextView':
(.text._D3gsv20SourceGutterRenderer20SourceGutterRenderer7getViewMFZC3gtk8TextView8TextView+0x94): undefined reference to `_D3gtk8TextView8TextView6__ctorMFPS4gtkc8gtktypes11GtkTextViewZC3gtk8TextView8TextView'
collect2: error: ld returned 1 exit status
--- errorlevel 1
但是当我评论 SourceView 相关代码并取消注释 TextView 相关代码时,它会编译并运行正常。
注意:此代码来自sourceView gtkd demos目录中的SVTest.d文件。
编辑:我正在做 dmd SVTest.d 进行编译,这给了我这个错误,现在我做了 dmd -L-ldl -L-lgtkd -L-lgtkdsv SVTest.d 并且编译得很好。现在,如果我删除pragma语句并尝试使用编译器标志进行编译,则会失败。我在这里有点困惑,D doc说pragma是用于将信息传递给编译器的!我是否需要编译指示和编译器标志来编译源代码?或者我做错了什么?
更新:确实pragma命令很重要,我将pragma更改为此
pragma(lib, "gtkdsv");
pragma(lib, "gtkd");
pragma(lib, "dl");
现在我可以做到
dmd main.d
我最初想做的事。
答案 0 :(得分:1)
我相信链接器标志的顺序很重要。 gtkd加载共享对象,并且需要libdl,因此-l-Ldl需要在列表中排在第一位。 (你在终端上做过的)
尝试移动编译指示(lib,“dl”);到第一个地方,看看是否有所作为。