在Linux上使用GtkD,我如何静态链接已编译的库?

时间:2012-06-07 19:12:04

标签: static-libraries d ubuntu-12.04 gtkd

这与此问题有关:GtkD (the Gtk+bindings for the D language) why compile it?

我在Ubuntu 12.04上使用带有D编程语言的GtkD,我试图将已编译的库与我的程序静态链接。编译GtkD后,有三个库

  1. libgtkd.a
  2. libgtkdgl.a
  3. libgtkdsv.a
  4. 执行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错误,但它是否正确链接?

2 个答案:

答案 0 :(得分:3)

参数的顺序与 ld (链接器)有关。通常,您应该在依赖于它们的代码/库之后放置依赖项。所以我会像这样重写你的pragma:

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

答案 1 :(得分:0)

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

rdmd libgtkd.a libgtkdgl.a libgtkdsv.a -L-ldl hello_world.d