Исходники CPython - как построить STATIC python26.lib? - PullRequest
5 голосов
/ 19 ноября 2011

Я пытаюсь скомпилировать мой файл hello.pyx в исполняемый файл с использованием Cython.

Первым шагом было скомпилировать hello.pyx в файл hello.cpp с помощью команды "cython --cplus --embed hello.pyx". Опция Embed означает Generate a main() function that embeds the Python interpreter. Я пытаюсь создать независимый exe без зависимостей.

В hello.cpp у меня есть #include "Python.h", поэтому я загружаю исходники Python отсюда: http://www.python.org/download/releases/2.6.6/, выбирая Gzipped исходный tar-шар (2.6.6) . Я добавляю include dir и получаю ошибку об отсутствии Python26.lib. Поэтому я пытаюсь это скомпилировать. При сборке по умолчанию создается python26.lib, но это всего лишь 200 КБ, это не статическая библиотека, при попытке скомпилировать hello.cpp появляются ошибки отсутствующих ссылок.

В README я не вижу полезных инструкций о том, как сделать это статически. Тем не менее, я гуглил онлайн-файл README, для последней версии python в trunk (3.x) есть некоторая полезная информация о статическом построении:

http://svn.python.org/projects/python/trunk/PCbuild/readme.txt

Решение не имеет конфигурации для статических библиотек. Однако это легко он строит статическую библиотеку вместо DLL. Вы просто должны установить «Тип конфигурации» - «Статическая библиотека (.lib)» и измените препроцессор макрос "Py_ENABLE_SHARED" в "Py_NO_ENABLE_SHARED". Вам также может понадобиться измените «Библиотека времени выполнения» с «Многопоточная DLL (/ MD)» на "Многопоточный (/MT)".

Но, тем не менее, здесь не так уж много подробностей, могу ли я настроить все проекты в решении для построения в виде статической библиотеки? Или только питонкор? Проекты "Python" и "Pythonw" - это "Приложения", поэтому я могу только изменить библиотеку времени выполнения на / MT. Вот шаги, которые я делаю:

  • Переход в режим «Отпустить».
  • Проект "Python" - установка /MT и добавление определения препроцессора Py_NO_ENABLE_SHARED
  • Проект "Pythoncore" - тип конфигурации Static library (.lib), / MT, замена определения препроцессора Py_ENABLE_SHARED на Py_NO_ENABLE_SHARED
  • Проект "Pythonw" - такой же, как в "Python".
  • Я щелкаю правой кнопкой мыши на "Python".

Краткое описание сборки:

Сборка: 5 успешных, 1 неудачных , 0 актуальных, 0 пропущенных

kill_python (ok)
make_buildinfo (ok)
make_versioninfo (ok)
pythoncore (ok)
w9xpopen (ok)
python (4 errors)

Проект, который потерпел неудачу - это "Python", вот журнал:

------ Build started: Project: python, Configuration: Release Win32 ------
Compiling...
python.c
Compiling resources...
Microsoft (R) Windows (R) Resource Compiler Version 6.1.7600.16385
Copyright (C) Microsoft Corporation.  All rights reserved.
Linking...
pythoncore.lib(sysmodule.obj) : error LNK2019: unresolved external symbol __Py_svnversion referenced in function _svnversion_init
pythoncore.lib(getversion.obj) : error LNK2019: unresolved external symbol _Py_GetBuildInfo referenced in function _Py_GetVersion
pythoncore.lib(dynload_win.obj) : error LNK2019: unresolved external symbol __Py_DeactivateActCtx referenced in function __PyImport_GetDynLoadFunc
pythoncore.lib(dynload_win.obj) : error LNK2019: unresolved external symbol __Py_ActivateActCtx referenced in function __PyImport_GetDynLoadFunc
d:\python\src4\PCbuild\\python.exe : fatal error LNK1120: 4 unresolved externals
Build Time 0:02

Я смотрю на каталог / PCbuild / и вижу, что "pythoncore.lib" существует (10 МБ), но нет "python26.lib".

Когда я гуглю эти ошибки, я нахожу только один разговор на mail.pythong.org: http://www.groupsrv.com/computers/about397568.html

Я попытался удалить определение препреоцессора "_USRDLL" в проекте pythoncore, но ошибки все те же.

Определения препроцессора в pythoncore:

_USRDLL
Py_BUILD_CORE
Py_NO_ENABLE_SHARED
WIN32

Когда я нажимаю "Изменить", я вижу в другом окне "Унаследованные значения", которые:

NDEBUG
_WIN32

Этот Ndebug странный, потому что я изменил режим на Release.

Я использую Visual Studio 2008 (не Express) со всеми установленными пакетами обновления.

Btw. Ранее я пытался создать полное решение, но были некоторые ошибки, связанные с отсутствующими файлами, путь которых начинается с: "../../dba-".


Я пытался скомпилировать версии Python 2.6.2 и 2.6.6, но они оба выдают одинаковые ошибки: pythoncore.lib(sysmodule.obj) : error LNK2019: unresolved external symbol

1 Ответ

2 голосов
/ 08 сентября 2012

Я собирал Python static с 2.4 до 2.7, и для его настройки требуется немного работы.

Вам необходимо обновить конфигурацию для всех включенных проектов в решении, установивих к / мт.Для сборки статического Python все, на что он ссылается, включая библиотеки, такие как SQLite или OpenSSL, также должно быть статичным.Это верно даже для модулей .pyd, которые на самом деле не включены, так как в противном случае они не будут импортированы позже.

Возможно, вам также понадобится выполнить это редактирование в верхней части модуля / socketmodule.h:

#else /* MS_WINDOWS */
# define inet_pton _msvc_inet_pton
# define inet_ntop _msvc_inet_ntop
# include <winsock2.h>
# include <ws2tcpip.h>
# include <wspiapi.h>
# undef inet_pton
# undef inet_ntop

Как только вы выйдете за пределы непосредственной ошибки, возможно, понадобятся другие вещи:

  • Отключить создание встроенных манифестов;смотрите строку ~ 650 в distutils msvc9compiler.py;тот факт, что он создает их даже при сборке с / MT, является ошибкой.

  • Измените / MD на / MT в distutils msvccompiler / msvc9compiler.py, поскольку в противном случае третьи стороны библиотеки не будут строитьправильно.

...