Я не могу собрать python.dll как статическую библиотеку (/MTd) с помощью Visual Studio

Я работаю с версией Python 3.6.4. У меня нет проблем со сборкой Visual Studio в качестве динамической библиотеки (/MDd). Я могу связать Python .dll со своим собственным кодом и проверить его работу.

Но когда я собираю его (и мой код) с помощью (/MTd), он скоро сбивается с пути, когда я пытаюсь открыть файл с помощью программы на Python. Утверждение отладки терпит неудачу в read.cpp ("Выражение: _osfile(fh) & FOPEN"). Я считаю, что Python .dll связывается с неподходящими системными библиотеками. Чего я не могу понять, так это как заставить его связываться с правильными (статическими библиотеками).

1 ответ

Это то, что мне нужно было сделать, чтобы построить и использовать Python, статически встроенный в другое приложение.

Чтобы построить статическую библиотеку python (например, python36_d.lib, python36.lib)

  1. Преобразуйте ВСЕ проекты в решении Python (pcbuild.sln) в статические. Это около 40 проектов, так что это может занять некоторое время. Это включает в себя настройку продуктов библиотеки для сборки в виде "статической библиотеки" и установку всех параметров сборки /MD и /MDd в /MT и /MTd.

  2. По крайней мере, для проекта pythoncore измените Preprocess, определив его как Py_NO_ENABLE_SHARED. Это говорит проекту, что он будет искать вызовы из статических библиотек.

  3. Добровольно или неправдоподобно, найдите себе файл pyconfig.h и поместите его в область "Включить" вашей сборки Python. Неясно, как этот файл построен из инструментов Windows, но, кажется, можно извлечь его из других источников, и он работает нормально. Вероятно, можно получить pyconfig.h из предварительно скомпилированной версии кода, который вы создаете. [Кстати, Python, который я построил, был 3.6.5 и был собран с Windows 2015, обновление 3.]

Надеюсь, это позволит вам собрать как python36.lib, так и python36_d.lib. Теперь вам нужно внести изменения в проект (ы) приложения, чтобы он мог связываться с библиотекой python. Вам нужно сделать это:

  1. Добавьте каталог Python Include в список Общие-> Включить каталоги.
  2. Добавьте каталоги библиотеки Python в списки General->Library Directories. Это будет..\PCBuild\win32 и..\PCBuild\amd64.
  3. Добавьте определение Py_NO_ENABLE_SHARED в область C/C++ -> Preprocessor.
  4. Для Linker->input добавьте (для выпусков) python36.lib;shlwapi.lib;version.lib и (для отладок) python36_d.lib;shlwapi.lib;version.lib.

И это должно быть так. Это должно работать и работать. Но еще одна вещь. Чтобы иметь возможность функционировать, исполняемый файл должен иметь доступ к каталогу Lib сборки Python. Таким образом, его копия должна быть перемещена туда, где находится исполняемый файл (содержащий встроенный питон). Или вы можете добавить область Lib в PATH для Windows. Это должно сработать.

Вот и все.

Другие вопросы по тегам