天天看点

交叉编译 not a dynamic executable_编译工具meson+ninja简介(dpdk编译工具)

一、简介

本来打算给大家介绍一下DPDK的编译步骤,发现新版本的DPDK编译工具已经推荐使用meson+ninja了, 为了咱能在一个频道上愉快的学习,干脆决定先和大家研究下meson+ninja。

meson 是一个类似  CMake 的编译工具. 包括 DPDK, QEMU 等很多项目都已经将编译系统转为 meson+ninja。 所以本文主要介绍如何用 meson+ninja 编译 C 代码工程。希望大家能认真学习,毕竟这套编译工具有可能成为未来开源项目的标配。

网上传言这一套编译工具具备以下卖点:

  • 支持多种操作系统, 如 Linux, macOS, Windows
  • 支持多种编译器, 如 GCC, Clang, Visual Studio 等
  • 支持多种编程语言, 包括 C, C++, D, Fortran, Java, Rust
  • 语法可读性好, 而且是对用户友好的非图灵完备(non-Turing complete) DSL
  • 支持多种操作系统及裸机(bare metal)的交叉编译
  • 完整编译或增量编译速度很快
  • built-in multiplatform dependency provider that works together with distro packages

大家看看就好,不必较真。

二、环境搭建(软件安装)

东西好不好,用了才知道,光说不练,有王婆卖瓜之嫌。这次给大家演示用的linux系统版本是CentOS Linux release 7.6.1810 (Core)。顺便给大家介绍下centos 系统怎么查看是哪个版本的,直接上图吧。

交叉编译 not a dynamic executable_编译工具meson+ninja简介(dpdk编译工具)

大家输入上图红色框命令,所见即为自己centos系统的版本号。言归正传,使用centos 7.6搭建meson+ninja编译环境,主要依赖三个rpm包:

  • python3.6
  • ninja-build
  • meson

python3安装

直接使用yum进行安装,输入下图红色框命令并回车即可(当然机器得能上网才行)。回车后大家的结果可能和下图稍有不同,是因为我的机器已经安装过python3了。

交叉编译 not a dynamic executable_编译工具meson+ninja简介(dpdk编译工具)

ninja rpm包安装

下载ninja-build rpm包:加微信ieee2000从我这里拷贝或者直接从这个网站下载https://cbs.centos.org/koji/buildinfo?buildID=24453,使用下图红色框命令并回车安装。大家的显示结果可能和我的不太一致,是因为这个我也之前安装过了。

交叉编译 not a dynamic executable_编译工具meson+ninja简介(dpdk编译工具)

meson rpm包安装

下载meson rpm包:加微信ieee2000从我这里拷贝或者直接从这个网站下载https://cbs.centos.org/koji/buildinfo?buildID=27917,使用下图红色框命令并回车安装。大家的显示结果可能和我的不太一致,是因为这个我也之前安装过了。

交叉编译 not a dynamic executable_编译工具meson+ninja简介(dpdk编译工具)

三、测试验证

创建c源文件

前面一大堆操作努力,就是希望这个环节可以正常使用。下面咱一起验证下这个环境搭好没。我们先创建一个helloworld.c文件,作为我们的项目工程文件,当然,这篇文章是想给大家介绍下meson+ninja,helloworld.c就一切从简了,内容如下:

交叉编译 not a dynamic executable_编译工具meson+ninja简介(dpdk编译工具)

运行时我们只是简单的打印一下hello world即可。

创建编译配置文件

接着咱创建编译配置文件 meson.build。要使用 meson, 必须在源码根目录编写一个

meson.build

文件,内容如下:

交叉编译 not a dynamic executable_编译工具meson+ninja简介(dpdk编译工具)

执行meson build

在c源文件和编译配置文件相同的目录下执行meson build命令,如下图:

交叉编译 not a dynamic executable_编译工具meson+ninja简介(dpdk编译工具)

执行后我们发现目录下多了一个build文件夹,没错,接下来的故事就在这个build下面展开。

执行ninja-build

进入buld目录,我们先ls命令观察一下里边的情况如下图:

交叉编译 not a dynamic executable_编译工具meson+ninja简介(dpdk编译工具)

发现里边有个build.ninja文件,没错,这个也是上一步生成的。我们接着在build目录下执行ninja-build并回车,结果如图所示:

交叉编译 not a dynamic executable_编译工具meson+ninja简介(dpdk编译工具)

看到没,咱们最终的可执行文件test1已经生成了,如上图所示。输入下图红色框命令验证一下是不是我们的c代码希望的结果。

交叉编译 not a dynamic executable_编译工具meson+ninja简介(dpdk编译工具)

果然,hello world打印到屏幕上了。全流程完,简单不。

四、总结

meson.build常用写法

project 

指定工程名和编程语言,如

project('test','c')

executable

指定build target为可执行程序,如

executable('hello','test.c')

可以用数组形式指定多个源码文件,如

srcs = ['a.c','b.c','test.c']

executable('hello',srcs)

library

指定build type为库,可以通过配置指定要生成静态库,动态库,或者两者都有,

project('shared lib','c')

library('mylib','source.c')