Я пытаюсь скомпилировать мой файл 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