【问题标题】:How to use Vala objects/methods from C?如何使用 C 中的 Vala 对象/方法?
【发布时间】:2012-08-22 18:08:52
【问题描述】:

此时我的应用程序完全是用 C 编写的,但我想开始在 Vala 中添加对象以用于各种 C 文件。我知道我可以使用 valac 生成 .c/.h 文件并将其包含在内,但最好将它们作为源文件包含到我的 automake 设置中。

这很简单,只需为任何 .c/.h 文件编写一个 vapi 文件并将其添加为 --pkg。不幸的是,对于我想要使用的方式来说,它似乎并不那么简单。

我还是做了一些相关的补充。

配置.ac:

AM_PROG_VALAC([0.12.0])

dnl Only adding these to test the package include in vala
OFS_PACKAGES="--pkg gee-1.0"
AC_SUBST(OFS_PACKAGES)

Makefile.am:

VALAFLAGS = \
    @OFS_PACKAGES@

src_ofs_SOURCES = \
    src/main.c \
    src/test.vala

src/main.c

#include "test.h"

...

FooTest *object = foo_test_new ();

src/test.vala:

using Gee;

namespace Foo {

    public class Test : Object {

        public Test () {
            stdout.printf ("Test construction\n");
        }
    }
}

当我运行 make 时出现错误

src/main.c:10:18: fatal error: test.h: No such file or directory

这并不奇怪,因为对 valac 的调用没有发生在对 gcc 的调用之前。所以问题真的是是否有办法告诉 automake/make 先运行 valac 以生成需要包含的文件?

UPD:

通过以下更改设法使其正常工作:

Makefile.am:

VALAFLAGS = \
    -H ofs.h -C -c
    @OFS_PACKAGES@

src_ofs_SOURCES = \
    src/test.vala \
    src/main.c

【问题讨论】:

    标签: c vala


    【解决方案1】:

    http://www.gnu.org/software/automake/manual/automake.html#Built-Sources-Example

    最简单的解决方法是将test.h 添加到 BUILT_SOURCES:

    BUILT_SOURCES += src/test.h
    CLEANFILES += $(BUILT_SOURCES)
    

    您可以通过将您的 vala 文件放在它们自己的变量中来扩展它:

    src_ofs_VALASOURCES = $(filter %.valam,$(src_ofs_SOURCES))
    BUILT_SOURCES += $(src_ofs_VALASOURCES:.vala=.h)
    

    另一种方法是将其添加到nodist_ofs_SOURCESsrc/main.$(OBJEXT) 的依赖项中。

    【讨论】:

    • 谢谢你。我能够通过更改源顺序和 valaflags 来使其工作(将在此之后发布更改),但我会尝试您的建议,因为它们看起来更像是正确的解决方案。
    • 您还需要让 valac 生成一个 C 头文件 (--header test.h),并且您可能需要添加一个依赖于戳文件的 test.h 目标。另请注意,它不是每个源文件都有一个标头,因此使用 *_SOURCES 生成 BUILT_SOURCES 可能不是一个好主意。
    • @nemequ 我正要发布回复说我测试了 ecatmur 提出的建议,并发现与您提到的内容完全相同的问题。我的解决方案也是为所有要使用的 .vala 文件指定一个带有 --header 的头文件,并且不做任何扩展 .vala=.h 的工作。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多