Компиляция модулей python с определением DEBUG на MSVC
Python довольно тупо имеет директиву прагмы в своих файлах include, которая создает связь с python26_d.lib
, когда определена препроцессор DEBUG
. Это проблема, потому что установщик python не поставляется с python26_d.lib
! Поэтому я не могу создавать приложения в msvc в режиме отладки. Если я временно #undef DEBUG
только для одного файла, я получаю много жалоб на несогласованную связь DLL. Если я изменю прагму в pythons, включите файл, я получаю ссылки undefined на различные функции отладки.
Я попробовал скомпилировать мою собственную версию python, но ее как-то еще немного отличался от распространяемого питона, который я не могу использовать мои модули с приложениями, созданными с ванильной версией python
Может ли кто-нибудь дать мне совет о том, как обойти это?
Спасибо
Ответы
Ответ 1
Из список python
Как обходной путь к ситуации, попробуйте скопировать файл python26.dll в python26_d.dll. (Я не уверен, что это будет работать; вы говорите, что строите Библиотека SWIG в режиме отладки, и это возможно, что SWIG попытается использовать функции отладки Python версия. Если это произойдет, вы не имеют иного выбора, кроме как использовать отладочная версия Python.)
Изменить: Из комментариев:
Вы также должны отредактировать pyconfig.h и закомментируйте строку "#define Py_DEBUG" (строка 374)
Ответ 2
После того, как вы прокомментируете "#define Py_DEBUG" в строке 332 и измените
# ifdef _DEBUG
# pragma comment(lib,"python26_d.lib")
# else
к
# ifdef _DEBUG
# pragma comment(lib,"python26.lib")
# else
вам больше не нужно python26_d.lib.
Ответ 3
Вы также можете пойти другим путем: переключитесь на "Release", а затем отлаживайте его. вам необходимо включить генерацию информации отладочных символов в свойствах проекта в префиксах компилятора и компоновщика; MSDN здесь расскажет вам, какие параметры вам нужно настроить для отладки сборки релиза.
Ответ 4
Основываясь на всех ответах, я успешно отключил _DEBUG
временный:
#if _DEBUG
#define _DEBUG_IS_ENABLED
#undef _DEBUG
#endif
#include "pyconfig.h"
#if defined(_DEBUG_IS_ENABLED)
#define _DEBUG
#endif
Ответ 5
Это также работает при связывании со статическими библиотеками. Я сделал копию python26.lib и переименовал ее python26_d.lib. Я прокомментировал строку #define PY_DEBUG в pyconfig.h. Также изменилась прагма на "pragma comment (lib," python26.lib ")" в строке 332. Voila! Это сработало.