мне удалось построить статическую библиотеку CPython на Windows 10, начиная с проектом здесь в качестве основы (построено на Visual C++ 2008):Строительство CPython статический на Windows - связывающие проблемы
https://github.com/zeha/python-superstatic
Первых , используя предписанные инструкции, я смог получить библиотеку, построенную в VS2015, путем поиска обходных решений, перечисленных ниже.
Как только библиотека была построена, я приступил к компиляции и компоновки приводимого примера источника с, но вскоре свел к следующему коду теста:
#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
Я также указал библиотеку в (попробовал как голое имя lib, так и абсолютное поглаживание ч):
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 и поместил папку Cygwin bin в путь.
Ни версии 7zip загружающие пришли с 7za.exe, так что это было необходимо переименовать 7z.exe в 7za.exe
NASM
NASM не установлен в пути, допускаемых инструкции. Вместо этого я использовал:
SET PATH = C: \ Program Files \ 7-Zip, C: \ Users \ Джеймсе \ AppData \ Local \ NASM;% PATH%
Сложение среда
Вместо вызова команды SetEnv VC++ 2008 для создания среды сборки командной строки, я использовал «Командная строка разработчика для VS2015».
PS: Я начал с создания этого в среде VC++ 2008, где все вышеперечисленное было применено, но кроме того, мне пришлось решить проблему ниже. Как только я решил это, у меня были те же проблемы связи, что и с VS2015.
Существует проблема с установкой 7.1 SDK в Windows 10 из-за непризнанной версии .NET в реестре. См:
Cannot install Windows SDK 7.1 on Windows 10
Чтобы установить 7.1 SDK с полными инструментами MSBuild, нужно было изменить все места в реестре (8, а не 2 сообщил, нужно искать), где версию установленного Программное обеспечение .NET записано:
Возможно ли показать каталоги дополнительной зависимости/параметры компоновщика? Это было бы более полезно. – Ram
Я обновил вопрос, чтобы показать ценности, которые, я считаю, вы просите. Обратите внимание на поправку к первому имени свойства. Если я изменю имя lib на несуществующий файл, это приведет к ошибке, говорящей «не удается открыть файл ввода», поэтому я считаю, что эти параметры приводят компоновщик в нужный файл. –
Изучая вопрос о том, откуда берется префикс __imp, это когда линкер хочет связать с DLL, поэтому считает, что предоставленный .lib является библиотекой импорта для DLL. Я делал всевозможные тесты с опциями, переданными в cl.exe и link.exe, но не мог изменить это поведение. Оказывается, в pyconfig.h есть некоторые определения, которые управляют поведением ссылок. Теперь я получил еще больше, но, похоже, впереди еще впереди. См. [Этот поток python-dev] (https://mail.python.org/pipermail/python-dev/2004-July/046499.html) Я отвечу позже, если я получу где-нибудь –