如何在使用meson

时间:2017-08-02 16:09:12

标签: c meson-build

我对介子和C很新,请原谅我,如果这个问题的答案是微不足道的......

我想在C项目中使用OpenMP,我使用meson作为构建工具 我想从这个tutorial编译parallel for示例。 我的main.c看起来非常相似:

#include <omp.h>
#define N       1000
#define CHUNKSIZE   100

int main(int argc, char *argv[]) {

  int i, chunk;
  float a[N], b[N], c[N];

  /* Some initializations */
  for (i=0; i < N; i++)
    a[i] = b[i] = i * 1.0;
  chunk = CHUNKSIZE;

#pragma omp parallel for      \
  shared(a,b,c,chunk) private(i)  \
  schedule(static,chunk)
  for (i=0; i < N; i++)
    c[i] = a[i] + b[i];

  return 0;
}

我的简短meson.build文件包含以下内容:

project('openmp_with_meson', 'c')

# add_project_arguments('-fopenmp', language: 'c')

exe = executable('some_exe', 'src/main.c') #, c_args: '-fopenmp')

我在此处对c_args的调用中注释了executable关键字 现在我最终得到以下场景:

  • 没有'-fopenmp'选项,我收到警告,pragma未知,将被忽略(正如我所料):../src/main.c:15:0: warning: ignoring pragma omp parallel [-Wunknown-pragmas] #pragma omp parallel for
  • 插入了选项c_args: '-fopenmp',我不再收到上述警告,而是因为GOMP_parallelomp_get_num_threadsomp_get_thread_num的未定义引用而出现错误,而且没有建成
  • 当我用gcc -Wall -o manually_with_gcc ../src/main.c -fopenmp手动使用gcc时,程序编译并执行时没有任何错误。

有人能告诉我如何使用meson编译可执行文件吗?

2 个答案:

答案 0 :(得分:1)

link_args : '-fopenmp'需要另一个关键字arg executable()

exe = executable('some_exe', 'src/main.c', c_args: '-fopenmp', link_args : '-fopenmp')

Meson在两个阶段构建C程序,编译和链接。您可以使用c_args传递额外参数进行编译,并使用link_args进行链接。

选项-fopenmp在编译时启用OpenMP指令,

  

the flag also arranges for automatic linking of the OpenMP runtime library

也就是说,-fopenmp是双重目的选项。

现在,上述内容简单而且好。但是,一旦理解了它,您还可以使用-fopenmp编译程序以激活OpenMP指令,并将您自己的 -fopenmp链接到link_args }。

这是一个完整的meson.build

project('openmp_with_meson', 'c')

cc = meson.get_compiler('c')
libgomp = cc.find_library('gomp')

exe = executable('some_exe', 'src/main.c',
         c_args: '-fopenmp',
         dependencies : libgomp)

答案 1 :(得分:0)

介子> = 0.46现在具有内置(docs):

openmp = dependency('openmp') # meson builtin