教程

本页面从基础开始,展示如何为一个简单的项目创建一个 Meson 构建定义。然后,我们将扩展它以使用外部依赖项,展示如何轻松地将它们集成到您的项目中。

本教程主要针对 Linux 用户编写。它假设您在系统上可以使用 GTK 开发库。在 Debian 派生系统(如 Ubuntu)上,可以使用以下命令安装它们

sudo apt install libgtk-3-dev

此外,建议使用版本 2.74 或更高版本的 glib 库。

您可以在其他平台上构建 GUI 应用程序,例如 Windows 和 macOS,但您需要安装必要的依赖项。

谦虚的开端

让我们从最基本的程序开始,经典的 hello 示例。首先,我们创建一个名为 main.c 的文件,它包含源代码。它看起来像这样。

#include <stdio.h>

//
// main is where all program execution starts
//
int main(int argc, char **argv) {
  printf("Hello there.\n");
  return 0;
}

然后,我们创建一个 Meson 构建描述,并将其放入同一目录中的名为 meson.build 的文件中。其内容如下。

project('tutorial', 'c')
executable('demo', 'main.c')

就是这样。请注意,与 Autotools 不同,您不需要将任何源代码头文件添加到源代码列表中

现在我们准备构建我们的应用程序。首先,我们需要通过进入源代码目录并发出以下命令来初始化构建。

$ meson setup builddir

我们创建一个单独的构建目录来保存所有编译器输出。Meson 与其他一些构建系统不同,它不允许在源代码中进行构建。您必须始终创建单独的构建目录。常见的约定是将默认构建目录放在顶级源代码目录的子目录中。

当 Meson 运行时,它会打印以下输出。

The Meson build system
 version: 0.13.0-research
Source dir: /home/jpakkane/mesontutorial
Build dir: /home/jpakkane/mesontutorial/builddir
Build type: native build
Project name is "tutorial".
Using native c compiler "ccache cc". (gcc 4.8.2)
Creating build target "demo" with 1 files.

现在我们准备构建我们的代码。

$ cd builddir
$ ninja

如果您的 Meson 版本高于 0.55.0,则可以使用新的后端无关构建命令

$ cd builddir
$ meson compile

在本文档的其余部分,我们将使用后一种形式。

构建可执行文件后,我们可以运行它。

$ ./demo

这将产生预期的输出。

Hello there.

添加依赖项

仅仅打印文本有点过时了。让我们更新我们的程序,改为创建一个图形窗口。我们将使用 GTK+ 窗口小部件工具包。首先,我们编辑主文件以使用 GTK+。新版本看起来像这样。


#include <gtk/gtk.h>

//
// Should provided the active view for a GTK application
//
static void activate(GtkApplication* app, gpointer user_data)
{
  GtkWidget *window;
  GtkWidget *label;

  window = gtk_application_window_new (app);
  label = gtk_label_new("Hello GNOME!");
  gtk_container_add (GTK_CONTAINER (window), label);
  gtk_window_set_title(GTK_WINDOW (window), "Welcome to GNOME");
  gtk_window_set_default_size(GTK_WINDOW (window), 400, 200);
  gtk_widget_show_all(window);
} // end of function activate

//
// main is where all program execution starts
//
int main(int argc, char **argv)
{
  GtkApplication *app;
  int status;

#if GLIB_CHECK_VERSION(2, 74, 0)
  app = gtk_application_new(NULL, G_APPLICATION_DEFAULT_FLAGS);
#else
  app = gtk_application_new(NULL, G_APPLICATION_FLAGS_NONE);
#endif
  g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
  status = g_application_run(G_APPLICATION(app), argc, argv);
  g_object_unref(app);

  return status;
} // end of function main

然后,我们编辑 Meson 文件,指示它找到并使用 GTK+ 库。

project('tutorial', 'c')
gtkdep = dependency('gtk+-3.0')
executable('demo', 'main.c', dependencies : gtkdep)

如果您的应用程序需要使用多个库,则需要为每个库使用单独的 dependency() 调用,如下所示

gtkdeps = [dependency('gtk+-3.0'), dependency('gtksourceview-3.0')]

在当前示例中,我们不需要它。

现在我们准备构建。需要注意的是,我们不需要重新创建构建目录,运行任何神奇的命令或类似操作。相反,我们只需要键入与在没有构建系统更改的情况下重新构建代码时完全相同的命令。

$ meson compile

首次设置构建目录后,您就不再需要运行 meson 命令。您始终只需要运行 meson compile。Meson 会自动检测到您对构建定义的更改,并负责所有操作,因此用户无需操心。在这种情况下,将产生以下输出。

[1/1] Regenerating build files
The Meson build system
 version: 0.13.0-research
Source dir: /home/jpakkane/mesontutorial
Build dir: /home/jpakkane/mesontutorial/builddir
Build type: native build
Project name is "tutorial".
Using native c compiler "ccache cc". (gcc 4.8.2)
Found pkg-config version 0.26.
Dependency gtk+-3.0 found: YES
Creating build target "demo" with 1 files.
[1/2] Compiling c object demo.dir/main.c.o
[2/2] Linking target demo

请注意,Meson 如何注意到构建定义已更改,并自动重新运行自身。现在程序已准备运行

$ ./demo

这将创建以下 GUI 应用程序。

GTK+ sample application screenshot

搜索结果为