【问题标题】:Can't compile GtkD SourceView code无法编译 GtkD SourceView 代码
【发布时间】:2012-11-18 15:15:53
【问题描述】:

我是 gtk 编程和 gtkd 源代码的 d 和学习新手。当我尝试编译下面的代码时[我在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 演示目录中的 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

我原本想做的。

【问题讨论】:

  • 你用什么编译?看起来链接器找不到所需的模块。您确定将它们包含在标志中吗?

标签: d archlinux gtkd


【解决方案1】:

我相信链接器标志的顺序很重要。 gtkd 加载共享对象,并且需要 libdl,所以 -l-Ldl 需要在列表的第一位。 (你在终端上做的)

尝试移动 pragma(lib, "dl");到第一个位置,看看有没有区别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    相关资源
    最近更新 更多