【问题标题】:How to use and compile standard c Lib in vala?如何在vala中使用和编译标准c Lib?
【发布时间】:2018-12-04 22:31:16
【问题描述】:

我刚开始在 Vala 进行一些测试。 瓦拉对我来说是新的。当然,我开始阅读大量 tuto,但我不明白我的错误。

如何使用和编译以下代码?

using Gtk;
#include <stdio.h>
// compile with  valac --pkg gtk+-3.0 hello_world_gtk_01.vala

public const int EXIT_SUCCESS=0;

int main (string[] args) 
{
    Gtk.init (ref args);

    var window = new Window ();
    window.title = "Hello, World!";
    window.border_width = 10;
    window.window_position = WindowPosition.CENTER;
    window.set_default_size (350, 70);
    window.destroy.connect (Gtk.main_quit);

    stdout.printf ("Version de gtk: %d.%d.%d\n", MAJOR_VERSION, MINOR_VERSION, MICRO_VERSION);  
    stdout.printf ("Version de gtk: %u.%u.%u\n", get_major_version() , get_minor_version(), get_micro_version());   


    string  name, str;

    name = "Version de gtk: ";
    sprintf(str, "%d", get_major_version());
    name = name+ str;
    sprintf(str, "%d", get_minor_version());
    name = name+ str;
    sprintf(str, "%d", get_micro_version());
    name = name+ str+ "\n"; 

    var label = new Label (name);
    window.add (label);
    window.show_all ();

    Gtk.main ();
    return EXIT_SUCCESS;
}

什么是坏的? gcc说

hello_world_gtk_01.vala:2.2-2.9: error: syntax error, invalid preprocessing directive
#include <stdio.h>
 ^^^^^^^^
hello_world_gtk_01.vala:2.10-2.10: error: syntax error, expected identifier
#include <stdio.h>
         ^
Compilation failed: 2 error(s), 0 warning(s)

您能帮我了解如何管理 stdio 吗?

【问题讨论】:

    标签: gtk3 vala


    【解决方案1】:

    Vala 生成 C 代码,但您不能将 C 直接从 Vala 文件传递​​给生成的 C。Vala [CCode] 属性可以很好地控制生成的 C,但在大多数情况下您不需要它。有关标准 C 名称及其 GLib 等效项的示例,请查看 Vala 存储库中的 glib-2.0.vapi 文件。其他标准 C 和 POSIX 扩展在 posix.vapi 中。还有一个深入的tutorial 关于编写从 Vala 到 C 库的绑定。但是,编写绑定是一个更高级的主题,您在示例中尝试实现的目标不需要新的绑定。

    您的示例使用字符串插值。在 Vala 中,数据类型可以有一个方法,因此编写您想要的内容的一种方法是:

    name = "Version de gtk: %u.%u.%u\n".printf( get_major_version (), get_minor_version (), get_micro_version ());

    Vala 还有一个字符串模板语法@"",然后在字符串内部计算一个表达式$()。例如:

    name = @"Version de gtk: $(get_major_version ()).$(get_minor_version ()).$(get_micro_version ())\n";

    之所以有效,是因为函数调用的返回值uint 有一个由字符串模板隐式调用的to_string () 方法。

    这是您的示例修改为使用字符串模板方法:

    using Gtk;
    // compile with  valac --pkg gtk+-3.0 hello_world_gtk_01.vala
    
    public const int EXIT_SUCCESS=0;
    
    int main (string[] args)
    {
        Gtk.init (ref args);
    
        var window = new Window ();
        window.title = "Hello, World!";
        window.border_width = 10;
        window.window_position = WindowPosition.CENTER;
        window.set_default_size (350, 70);
        window.destroy.connect (Gtk.main_quit);
    
        stdout.printf ("Version de gtk: %d.%d.%d\n", MAJOR_VERSION, MINOR_VERSION, MICRO_VERSION);
        stdout.printf ("Version de gtk: %u.%u.%u\n", get_major_version() , get_minor_version(), get_micro_version());
    
    
        var name = @"Version de gtk: $(get_major_version ()).$(get_minor_version ()).$(get_micro_version ())\n";
    
        var label = new Label (name);
        window.add (label);
        window.show_all ();
    
        Gtk.main ();
        return EXIT_SUCCESS;
    }
    

    【讨论】:

    • 好的,我了解如何管理字符串。如何在 vala 中编译 2 个源文件并在链接后仅在一个可执行文件中?我在教程 wiki.gnome.org/Projects/Vala/Tutorial 中没有找到任何内容。像 C 中这样的标头是否有必要?
    • valac 将编译为 C,然后调用 C 编译器和链接器。所以它是valac source1.vala source2.vala --output my_executable。 C 头文件使用pkg-config 找到。您也可以只生成 C,然后手动调用 C 编译器和链接器。 Vala 命令是valac source1.vala source2.vala --ccode,它只为您提供 C 文件。对于较大的项目,您希望查看像 Meson 这样的构建系统。
    • 好的,非常感谢。我尽快尝试这个解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-26
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    相关资源
    最近更新 更多