优雅的跨平台cython模块编译

时间:2018-10-25 11:05:53

标签: python compilation cython

我正在编写一个包含多个用Cython编写的模块的库,并使用openmp模块大量使用并行性。该库可在任何平台上使用-Unix / Mac / Windows。

因此,我必须在模块定义中添加编译器标志,因此它是根据openmp进行编译的。仅对于linux和mac,我做了这样的事情:

Extension('my.module', ['my/module.c'],
          extra_compile_args=['-fopenmp', '-O3'],
          extra_link_args=['-fopenmp', '-O3'],
          ),

但是,这在Windows上不起作用,因为msvcc的指令格式不同,即-fopenmp替换为/openmp-O3替换为/O3 。我当前的解决方案如下:

IS_WINDOWS = 'win' in sys.platform
openmp_opt = '/openmp' if IS_WINDOWS else '-fopenmp'
optim_opt = '/O3' if IS_WINDOWS else '-O3'

Extension('my.module', ['my/module.c'],
          extra_compile_args=[openmp_opt, optim_opt],
          extra_link_args=[openmp_opt, optim_opt],
          ),

此方法尽我所能进行测试。它有一个问题:msvcc不需要extra_link_args,而gcc则需要。因此,在Windows上编译时,我收到链接器警告,指出/O3/openmp被识别。

我的问题是:有没有更好的方法,内置在cython中,我还没有发现?是否有我错过的情况,即是否有其他我需要担心的编译器?窗户检查够好吗?

0 个答案:

没有答案