在python扩展中为C和C ++文件使用不同的编译器标志

oekopez:

对于我的python扩展,我同时拥有C(来自嵌入式库)和C ++文件,它们被编译并链接在一起。只有C ++部分(通过SWIG)与Python交互。这在带有VS2015的Windows和Linux下的gcc中都可以使用。但是,使用gcc时,C ++文件需要与C文件不同的一组编译器标志(例如-std = c ++ 11,-Wno-reorder),以避免出现有关C中标志不合适的警告。

setuptools / distutils中是否可以单独更改每个文件的编译器标志,例如。基于文件扩展名?

我已经使用了https://stackoverflow.com/a/36293331/3032680的自定义构建步骤

更新:

主要问题是,它distutils.ccompiler不检查C或C ++的文件扩展名,而是使用$ CC运行所有文件。即使定义CXXFLAGS也无济于事。我会忍受警告,在setup.py文件中export不会使用警告,也不会使用定义os.eniviron

更新2:

在使用CLang 8.0.0的macOS上,情况变得更糟:尝试使用-std = c ++ 11编译.c文件不是警告,而是错误。

oekopez:

由于distutils可以确保所有文件都使用相同的编译器标志进行编译,无论它们的文件扩展名为.c还是.cpp,它都有很长的路要走。因此,即使使用CFLAGS和CXXFLAGS也不被考虑,但是gcc和CLang仍然以不同的方式处理它们。Visual Studio只是将所有内容编译为C ++。

我接受了C在大多数情况下仍然是C ++的子集的问题,从而解决了我的问题,即使文件中包含C,也将C-Source文件重命名为.cpp。此解决方案很丑陋,但我摆脱了gcc和CLang的错误-尤其是因为此解决方案再次模糊了C和C ++之间的语言障碍。

我稍后采用的第二个解决方案是从distutlis外部的C代码创建一个静态库,并将Python扩展链接到该静态库

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何为.cabal文件中的不同目标使用两个不同的编译器?

如何使用自定义编译器和自定义标志构建Qt?

快速框架中的编译器标志

使用最佳编译器标志和配置从cmake运行Halide生成器

如何在CMAKE中针对不同文件使用不同的编译选项进行编译?

CMake 3.8+:为同时包含.cpp(C ++)和.cu(CUDA)文件的项目设置不同的编译器标志

CMAKE脚本中的编译器标志设置

使用noexcept和编译器标志关闭异常

指示Automake对* .S文件使用C ++编译器?

内联函数在不同的翻译单元中具有不同的编译器标志未定义的行为?

C ++编译器如何扩展前缀和后缀operator ++()?

如何忽略pip中的编译器标志?

如何使用Clang C编译器生成列表文件?

对同一对象中的不同源文件使用不同的编译器或编译器标志

使用C11和GNU11编译器标志的机器epsilon计算有所不同

使用setup.py编译Cython扩展时,这些额外的编译器标志从哪里来?

用不同的C ++编译器构建的二进制文件和库如何兼容?

定制命令中的Cmake(<3.6)编译器标志

为C源指定编译器标志

跨不同编译器的C ++库

较少的编译器在Linux和OSX上使用不同的浮点精度

在CC编译器中为C ++使用argv []

什么是-D编译器标志C ++(clang,GNU,MSVC)

C ++ 11的不同编译器行为

是什么导致即使在未修改源和编译器标志的情况下,目标文件在编译之间也有所不同?

如何可靠地修改构建配置并在C / C ++ RPM文件中添加编译器标志?

C# 编译器标志

如何从 cython 安装文件中删除 -pthread 编译器标志

makefile 使用 Mac 中的编译程序和它在其中使用的交叉编译器标志。如果我不使用交叉编译器,它们的含义和替代 4 标志