我对介子和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_parallel
,omp_get_num_threads
和omp_get_thread_num
的未定义引用而出现错误,而且没有建成gcc -Wall -o manually_with_gcc ../src/main.c -fopenmp
手动使用gcc时,程序编译并执行时没有任何错误。有人能告诉我如何使用meson编译可执行文件吗?
答案 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