0

这有点与这个问题有关:GtkD(D 语言的 Gtk+绑定)为什么要编译它?

我在 Ubuntu 12.04 上将 GtkD 与 D 编程语言一起使用,我一直试图将编译后的库与我的程序静态链接。一旦 GtkD 被编译,就会有三个库

  1. libgtkd.a
  2. libgtkdgl.a
  3. libgtkdsv.a

完成后将make install这些文件放入/usr/local/lib/文件夹中,并将 GtkD 源文件放入/usr/local/includes/d/文件夹中。我还将源代码编译为*.di文件并将它们放在相关文件夹中,/usr/local/includes/d/因为 make 脚本默认情况下不这样做。

这是我要编译的源代码。

pragma(lib, "/usr/local/lib/libgtkd.a");

import gtk.MainWindow;
import gtk.Label;
import gtk.Main;

void main(string[] args)
{
    Main.init(args);
    MainWindow win = new MainWindow("Hello World!");
    win.setDefaultSize(200, 100);
    win.add(new Label("Hello World"));
    win.showAll();
    Main.run();
}

这是我使用的编译器命令:

rdmd -L-ldl hello_world.d

这是错误:

/usr/local/lib/libgtkd.a(Loader.o): In function `_D4gtkc6Loader12pLoadLibraryFAyaE4gtkc6Loader4RTLDZPv':
src/gtkc/Loader.d:(.text._D4gtkc6Loader12pLoadLibraryFAyaE4gtkc6Loader4RTLDZPv+0x28): undefined reference to `dlopen'
src/gtkc/Loader.d:(.text._D4gtkc6Loader12pLoadLibraryFAyaE4gtkc6Loader4RTLDZPv+0x31): undefined reference to `dlerror'
/usr/local/lib/libgtkd.a(Loader.o): In function `_D4gtkc6Loader10pGetSymbolFPvAyaZPv':
src/gtkc/Loader.d:(.text._D4gtkc6Loader10pGetSymbolFPvAyaZPv+0x23): undefined reference to `dlsym'
src/gtkc/Loader.d:(.text._D4gtkc6Loader10pGetSymbolFPvAyaZPv+0x2c): undefined reference to `dlerror'
/usr/local/lib/libgtkd.a(Loader.o): In function `_D4gtkc6Loader14pUnloadLibraryFPvZi':
src/gtkc/Loader.d:(.text._D4gtkc6Loader14pUnloadLibraryFPvZi+0x9): undefined reference to `dlclose'
collect2: ld returned 1 exit status
--- errorlevel 1

shell returned 1  

任何想法我做错了什么?它看起来像一个 ld 错误,但这是链接的吗?

4

2 回答 2

3

参数的顺序与链接器ld很重要。通常,您应该将依赖项放在依赖于它们的代码/库之后。所以我会像这样重写你的编译指示:

pragma(lib, "gtkd"); // let ld find it in your path
pragma(lib, "dl");   // gtkd depends on dl, so link it after

现在尝试编译:

dmd hello_world.d
于 2012-06-07T20:26:27.350 回答
0

您在参数中传递它 dmd 知道它们需要传递给链接器

rdmd libgtkd.a libgtkdgl.a libgtkdsv.a -L-ldl hello_world.d
于 2012-06-07T20:05:53.197 回答