#c #python #swig
#c #python #swig
Вопрос:
Я создаю модуль python, который реализован на C . Я использую SWIG для создания интерфейса. Существуют различные способы создания расширения, я использую «предпочтительный подход», который используется через дистрибутивы python и который описан здесь. Имя моего модуля «ParseEvents», и для его компиляции я запускаю следующие две команды:
swig -c -python ParseEvents.i
python setup.py build_ext --inplace
Первая команда создает файл ParseEvents_wrap.cxx
Вторая команда использует следующее setup.py файл:
from distutils.core import setup, Extension
ParseEvents_module = Extension('_ParseEvents',
sources=['ParseEvents_wrap.cxx',],
extra_compile_args=["-Wno-deprecated","-O3"],
)
setup (name = 'ParseEvents',
ext_modules = [ParseEvents_module,],
py_modules = ["ParseEvents"]
)
Вопрос: Где и как мне указать, что я хочу, чтобы мой код C был скомпилирован с тегом компилятора -O3? Я предположил, что это будет просто в «extra_compile_args» части setup.py файл, но, похоже, это не тот случай. Когда я запускаю вторую команду (python setup.py build_ext —inplace), вот результат:
running build_ext
building '_ParseEvents' extension
creating build
creating build/temp.linux-x86_64-2.6
gcc -pthread -fno-strict-aliasing -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fPIC -I/usr/include/python2.4 -c ParseEvents_wrap.cxx -o build/temp.linux-x86_64-2.4/ParseEvents_wrap.o -Wno-deprecated -O3
c -pthread -shared build/temp.linux-x86_64-2.4/ParseEvents_wrap.o -o _ParseEvents.so
Обратите внимание, что оба флага -O2 и -O3 присутствуют в предпоследней строке выходных данных — Я бы хотел удалить -O2.
Комментарии:
1. Проверьте Make-файлы. Флаги компилятора указаны в файлах makefile. Если они сгенерированы make-файлами, то лучше всего проверить ваши файлы конфигурации и сборки.
Ответ №1:
В документе GCC явно сказано:
http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Optimize-Options.html
If you use multiple -O options, with or without level numbers, the last such option is the one that is effective.
Это означает, что ваш код будет скомпилирован с использованием -O3 фактически, так, как вы этого хотите. Не нужно беспокоиться о дублирующихся флагах оптимизации.
Ответ №2:
Distutils обладает прекрасной особенностью предоставления всех тех же флагов, с которыми был скомпилирован Python. В результате добавить дополнительные флаги легко, но удалить их — сплошная мука. Для этого необходимо создать подкласс класса компилятора, перехватить аргументы и вручную удалить флаг-нарушитель из списка аргументов, используемого функцией компиляции. В любом случае, это теория, документы слишком бедны, чтобы на самом деле показать вам, что вам нужно сделать, чтобы это произошло.
Но, как сказал Лютер, в вашем случае лишнее -O2
ничему не повредит.