- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
对于我的 python 扩展,我有 C(来自嵌入式库)和 C++ 文件,它们被编译并链接在一起。只有 C++ 部分与 Python 接口(interface)(通过 SWIG)。这在 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 也无济于事。我会忍受警告,无论是 export
还是在 setup.py 文件中使用 os.eniviron
的定义。
在带有 CLang 8.0.0 的 macOS 上,情况变得更糟:尝试使用 -std=c++11 编译 .c 文件不是警告而是错误。
最佳答案
因为 distutils 在确保所有文件都使用相同的编译器标志进行编译方面做了很大的努力,而不管它们的文件扩展名为 .c 或 .cpp。因此,即使使用 CFLAGS 和 CXXFLAGS 也没有被考虑在内,但 gcc 和 CLang 仍然以不同的方式处理它们。 Visual Studio 只是将所有内容编译为 C++。
我通过接受 C 在大多数情况下仍然是 C++ 的子集并将 C 源文件重命名为 .cpp 来解决我的问题,即使这些文件包含 C。这个解决方案很丑陋但我摆脱了警告在 gcc 中和 CLang 的错误 - 特别是因为这个解决方案再次模糊了 C 和 C++ 之间的语言障碍。
我后来采用的第二个解决方案是从 distutlis 外部的 C 代码创建一个静态库并链接 Python extension to that static library .
关于Python 扩展 : using different compiler flags for a C parts and C++ parts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47872981/
我是一名优秀的程序员,十分优秀!