Использование различных флагов компилятора для файлов C и C ++ в расширении Python

Для моего расширения Python у меня есть файлы C (из встроенной библиотеки) и C ++, и они скомпилированы и связаны друг с другом. Только часть C ++ взаимодействует с Python (через SWIG). Это работает как в Windows с VS2015 и GCC под Linux. Однако с gcc файлы C ++ нуждаются в другом наборе флагов компилятора (например, -std = c ++ 11, -Wno-reorder), чем файлы C, чтобы избежать предупреждений о неправильных флагах в C.

Есть ли способ в setuptools / distutils изменить флаги компилятора для каждого файла отдельно, например. на основании расширения файла?

Я использую уже пользовательский шаг сборки из https://stackoverflow.com/a/36293331/3032680.

Обновить:

Основная проблема в том, что distutils.ccompiler не проверяет расширение файла для C или C ++ и выполняет все с $ CC. Даже определение CXXFLAGS не помогает. Я буду терпеть предупреждения, ни с export ни определение с использованием os.eniviron в файле setup.py.

Обновление 2:

В macOS с CLang 8.0.0 ситуация ухудшается: попытка скомпилировать файл .c с -std = c ++ 11 — не предупреждение, а ошибка.

5

Решение

Поскольку distutils имеет большое значение для обеспечения того, чтобы все файлы компилировались с одинаковыми флагами компилятора, независимо от их расширения .c или .cpp. Следовательно, даже использование CFLAGS и CXXFLAGS не учитывается, но gcc и CLang по-прежнему обрабатывают их по-разному. Visual Studio просто компилирует все как C ++.

Я решил свою проблему, приняв, что C в большинстве случаев все еще является подмножеством C ++, и переименовал файлы C-Source в .cpp, даже если файлы содержат C. Это уродливое решение, но я избавился от предупреждений в gcc и ошибки с CLang — тем более что это решение снова стирает языковой барьер между C и C ++.

Второе решение, которое я принял позже, — это создать статическую библиотеку из кода C вне distutlis и связать Расширение Python для этой статической библиотеки.

-1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]