Мне удалось построить статическую библиотеку CPython в Windows 10, начав с проекта здесь в качестве основы (построенного вокруг Visual C ++ 2008):
https://github.com/zeha/python-superstatic
Во-первых, используя предписанные инструкции, я смог получить библиотеку, встроенную в VS2015, найдя обходные пути, перечисленные ниже.
Как только библиотека была собрана, я приступил к компиляции и компоновке поставляемого исходного кода c примера, но вскоре сократил это до следующего тестового кода:
#include <stdio.h>
#include <Python.h>
int main()
{
Py_Initialize();
return 0;
}
Мне пришлось удалить бит в pyconfig.h, который делает это:
pragma comment(lib,"python27.lib")
чтобы он искал символы в моей статической библиотеке.
Это не компилируется, потому что компоновщик жалуется:
Source.obj : error LNK2001: unresolved external symbol __imp__Py_Initialize
Я добавил путь к сгенерированной статической библиотеке pythonembed.lib в:
Properties->Linker->General->Additional Library Directories
Это установлено в:
/workspace/superstatic-python/Python-2.7.3/PCbuild
Я также указал библиотеку в (пробовал как пустое имя библиотеки и абсолютный путь):
Properties->Linker->Input->Additional Dependencies
Это установлено в:
pythonembed.lib
Выполнение команды:
dumpbin.exe /all pythonembed.lib
показывает, что есть символ с именем _Py_Initialize. Я проверил, что и статическая библиотека, и тестовый проект созданы с использованием набора инструментов v140 в качестве сборки выпуска для 32-разрядной версии.
Я пропустил какие-либо шаги, чтобы заставить VC ++ связываться правильно?
Интересно, что код вызывает Py_Initialise, компоновщик ищет __imp__Py_Initialize, но статическая библиотека имеет символ: _Py_Initialize.
Это указывает на решение?
ПРОБЛЕМЫ решить для сборки статической библиотеки на Windows 10 с VS2015:
GNU Patch
Патч GNU не работает для меня. Он запускает UAC и загружается в новую консоль и ничего не делает. Кажется, вызывает это поведение, потому что он называется «patch.exe». Я нашел различные обходные пути, упомянутые для этого, но вместо этого я использовал патч Cygwin и поместил папку bin Cygwin в путь.
Ни одна из версий 7zip не шла с файлом 7za.exe, поэтому необходимо было переименовать 7z.exe в 7za.exe.
NASM
Насм не установился в пути, указанном в инструкциях. Вместо этого я использовал:
SET PATH = C: \ Program Files \ 7-Zip; C: \ Users \ james \ AppData \ Local \ nasm;% PATH%
Построить среду
Вместо того чтобы вызывать команду SetEnv VC ++ 2008 для создания среды сборки командной строки, я использовал «Командная строка разработчика для VS2015».
PSЯ начал с того, что построил это в среде VC ++ 2008, где применимо все вышеперечисленное, но, кроме того, мне пришлось решить проблему ниже. После того, как я решил эту проблему, у меня возникли те же проблемы с линковкой, что и в сборке VS2015.
При установке 7.1 SDK в Windows 10 возникла проблема из-за неопознанной версии .NET в реестре. Увидеть:
Не удается установить Windows SDK 7.1 в Windows 10
Чтобы установить 7.1 SDK с полными инструментами MSBuild, необходимо было изменить все места в реестре (8, а не 2, о которых сообщалось, нужно искать), где записана версия установленного программного обеспечения .NET:
Чтобы успешно выполнить связывание исполняемого файла с сгенерированной статической библиотекой Python, необходимо было установить некоторые дополнительные параметры компилятора и включить несколько библиотек Windows.
Любой, кто хочет выполнить сборку самостоятельно, может начать с этого тестового кода (сохраните как simple.c):
#include <stdio.h>
#include <Python.h>
int main()
{
Py_Initialize();
PyRun_SimpleString(
"print 'This program contains a static version of Python.");
Py_Finalize();
return 0;
}
и следующий Makefile, который я создал:
PYTHON_V=2.7.3
OPENSSL_V=1.0.1c
ROOT=..\\
CFLAGS=/c /GF /MP4 /nologo /EHsc /I$(ROOT)openssl-$(OPENSSL_V)\inc32 \
/I$(ROOT)Python-$(PYTHON_V)\Include /I$(ROOT)Python-$(PYTHON_V)\PC \
/D Py_NO_ENABLE_SHARED /D Py_BUILD_CORE \
/DPy_BUILD_CORE /MD /W4 /O2
LINKFLAGS=/MACHINE:X86 /RELEASE /LTCG /NODEFAULTLIB:LIBCMT
LIBS=$(ROOT)openssl-$(OPENSSL_V)\out32\libeay32.lib \
$(ROOT)openssl-$(OPENSSL_V)\out32\ssleay32.lib \
$(ROOT)Python-$(PYTHON_V)\PCbuild\pythonembed.lib ws2_32.lib msvcrt.lib user32.lib shell32.lib advapi32.lib oleaut32.lib Gdi32.Lib Ole32.lib
CC= cl
LINK= link
all: simple.exe
simple.obj:
$(CC) $(CFLAGS) simple.c
simple.exe: simple.obj
$(LINK) $(LINKFLAGS) -out:simple.exe simple.obj $(LIBS)
Они должны находиться в новой папке в базовой папке Superstatic Python, затем из среды сборки Windows 7.1 SDK просто запустите
nmake
Если повезет, у вас теперь должен быть simple.exe в вашей папке, который для меня был 3,7 МБ, и работал как положено.
Других решений пока нет …