valac --vapi --internal-vapi --fast-vapi

valac --vapi --internal-vapi --fast-vapi

// Point.vala
namespace Test {
    class Point {
        public const int MY_CONST = 123;
        public float x { get; set; }
        public float y { get; set; }
    }
}

有一个vala源文件,'Point.vala'

  1. --vapi

valac --vapi=Point.vapi --library=point -X -shared Point.vala:

// Point.vapi
namespace Test {
}

空...

  1. --内部vapi

valac --internal-vapi=Point.vapi --header=Point.h --internal-header=Point_internal.h --library=point -X -shared Point.vala:

// Point.vapi
namespace Test {
    [CCode (cheader_filename = "Point_internal.h")]
    internal class Point {
        public const int MY_CONST;
        public Point ();
        public float x { get; set; }
        public float y { get; set; }
    }
}

它看起来很完美并且适合我

  1. --fast-vapi

valac --fast-vapi=Point.vapi --library=point -X -shared Point.vala:

// Point.vapi
using GLib;
namespace Test {
    internal class Point {
        public const int MY_CONST = 123; // error
        public Point ();
        public float x { get; set; }
        public float y { get; set; }
    }
}

这会引发错误,error: External constants cannot use values,当使用此 vapi

Q1: 确切的区别是什么?为什么会有这些选项。

Q2: 创建共享库,我应该使用--internal-vapi吗?

您的 class 未指定其可见性,因此默认具有 "internal" 可见性。

这意味着它只对您命名空间内的其他 class 可见。

如果您将 class 指定为 public,则 --vapi 开关将按预期输出一个 vapi 文件:

// Point.vala
namespace Test {
    // Make it public!
    public class Point {
        public const int MY_CONST = 123;
        public float x { get; set; }
        public float y { get; set; }
    }
}

调用:

valac --vapi=Point.vapi --library=point -X -shared Point.vala

结果:

/* Point.vapi generated by valac.exe 0.34.0-dirty, do not modify. */

namespace Test {
        [CCode (cheader_filename = "Point.h")]
        public class Point {
                public const int MY_CONST;
                public Point ();
                public float x { get; set; }
                public float y { get; set; }
        }
}

因此 --vapi 将仅输出 public 类型并且 --internal-vapi 还将输出内部类型。

我不知道 --fast-vapi 是干什么用的。

关于你的第二个问题,你通常应该对共享库使用 public classes。内部与 public 可见性的重点在于 public 类型供 public(在命名空间之外)使用,而内部类型仅用于内部实现细节。