Jump to content
Korean Random
Pavel3333

Ошибка при импортировании пида

Recommended Posts

Скомпилировал при помощи GCC пид из исходника, сгенерированного в Cython.

 

С одним пидом, который принтит строку, всё ок. Второй при импортировании дает такую ошибку:

*** [XFW/Entrypoint] Error:
*** Traceback (most recent call last):
***   File "scripts/client/gui/mods/mod_.py", line 51, in <module>
***   File "mods/xfw/python/xfw_loader.py", line 196, in <module>
***   File "mods/xfw/python/xfw_loader.py", line 179, in xfw_load_mods
*** UnicodeDecodeError: 'utf8' codec can't decode byte 0xcd in position 17: invalid continuation byte

Компилировать в VS не могу, так как нужна пакетная компиляция множества пидов.

 

команды GCC:

gcc -shared -W -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing -ansi -IC:\Python27\include -LC:\Python27\libs -o %s.pyd %s.c -lpython27

 

Версия XFW: 948

Share this post


Link to post

Short link
Share on other sites
1 час назад, Pavel3333 сказал:

Компилировать в VS не могу, так как нужна пакетная компиляция множества пидов.

 

 

И что мешает? MSBuild, Cmake, Meson, десятки билдсистем с поддержкой MSVC.

Только что, Pavel3333 сказал:

это тот который Cl.exe или MSBuild.exe?

Это слабосвязаные вещи, C1 - это собственно компилятор, MSBuild - это система сборки.

Share this post


Link to post

Short link
Share on other sites

@Mixaill у меня в одной папке содержатся (допустим) куча .c-файлов, и каждый мне нужно построить в пид. И на 400 файлов придется делать 400 проектов. Хотя хотелось бы в 1 команду всё сделать и без кучи папок для проектов. Как и чем это можно сделать? (ночь сейчас, я перекурил доки, потому не могу допетрить как это осуществить).

Кажется, нашел...https://msdn.microsoft.com/ru-ru/library/610ecb4h.aspx

попробую запилить на CL.exe.

Share this post


Link to post

Short link
Share on other sites

Сходу на CMake

 

cmake_minimum_required (VERSION 3.0)
project(manypyds LANGUAGES C)

find_package(libpython REQUIRED)

function(CreatePydProject FILENAME)
    get_filename_component(NAME "${FILENAME}" NAME_WE)
    add_library(${NAME} SHARED "${FILENAME}")  
    target_compile_definitions(${NAME} PRIVATE "_CRT_SECURE_NO_WARNINGS")
    target_link_libraries(${NAME} libpython::python27)
    set_target_properties(${NAME} PROPERTIES SUFFIX ".pyd")
    set_target_properties(${NAME} PROPERTIES LINK_FLAGS "/INCREMENTAL:NO")
    install(TARGETS ${NAME} RUNTIME DESTINATION ".")
endfunction()

file(GLOB_RECURSE SOURCES "*.c")

foreach(SOURCE ${SOURCES})
    CreatePydProject(${SOURCE})
endforeach()

Тут больше вопрос, откуда вообще появилось 400 файлов, каждый из которых должен быть собран в свою библиотеку.

1 час назад, Pavel3333 сказал:

C:\Python27\include

компилировать с ванильными хидерами нельзя, видимо в этом и проблема

Share this post


Link to post

Short link
Share on other sites
4 часа назад, Mixaill сказал:

Тут больше вопрос, откуда вообще появилось 400 файлов, каждый из которых должен быть собран в свою библиотеку.

Когда запилю, обязательно расскажу ;)

4 часа назад, Mixaill сказал:

Сходу на CMake

Спасибо!

4 часа назад, Mixaill сказал:

компилировать с ванильными хидерами нельзя, видимо в этом и проблема

не знал об этом.

Share this post


Link to post

Short link
Share on other sites
11 часов назад, Mixaill сказал:

Сходу на CMake

не может найти libpython:

Цитата

 

By not providing "Findlibpython.cmake" in CMAKE_MODULE_PATH this project
  has asked CMake to find a package configuration file provided by
  "libpython", but CMake did not find one.

  Could not find a package configuration file provided by "libpython" with
  any of the following names:

    libpythonConfig.cmake
    libpython-config.cmake

  Add the installation prefix of "libpython" to CMAKE_PREFIX_PATH or set
  "libpython_DIR" to a directory containing one of the above files.  If
  "libpython" provides a separate development package or SDK, be sure it has
  been installed.

 

 

Share this post


Link to post

Short link
Share on other sites

- кладешь свои файлы в какой-нибудь C:\Test\sources (чтобы проще объяснять)

- создаешь каталог C:\Test\sources\build

- выкатываешь -devel архив и распаковываешь его (например, в C:\Test\xfwnative)

- выполняешь в каталог C:\Test\sources\build команду cmake ..  -DCMAKE_INSTALL_PREFIX=C:/Test/install -DCMAKE_PREFIX_PATH=C:/Test/xfwnative

выполняешь там же cmake --build . --target INSTALL --config RelWithDebInfo

Edited by Mixaill
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

@Mixaill Спасибо!!!

15 минут назад, Mixaill сказал:

cmake --build . --target INSTALL --config RelWithDebInfo

Цитата

 

C:\WoTPython>cmake --build . --target INSTALL --config RelWithDebInfo
Microsoft (R) Build Engine версии 15.6.85.37198 для .NET Framework
(C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.

Сборка начата 19.05.2018 14:40:19.
Проект "C:\WoTPython\INSTALL.vcxproj" в узле 1 (целевые объекты по умолчанию).
Проект "C:\WoTPython\INSTALL.vcxproj" (1) выполняет сборку "C:\WoTPython\ZERO_C
HECK.vcxproj" (2) в узле 1 (целевые объекты по умолчанию).
PrepareForBuild:
  Создание каталога "Win32\RelWithDebInfo\ZERO_CHECK\".
  Создание каталога "C:\WoTPython\RelWithDebInfo\".
  Создание каталога "Win32\RelWithDebInfo\ZERO_CHECK\ZERO_CHECK.tlog\".
InitializeBuildStatus:
  Создание "Win32\RelWithDebInfo\ZERO_CHECK\ZERO_CHECK.tlog\unsuccessfulbuild",
   так как было задано "AlwaysCreate".
CustomBuild:
  Checking Build System
  CMake does not need to re-run because C:/WoTPython/CMakeFiles/generate.stamp
  is up-to-date.
FinalizeBuildStatus:
  Файл "Win32\RelWithDebInfo\ZERO_CHECK\ZERO_CHECK.tlog\unsuccessfulbuild" удал
  яется.
  Обращение к "Win32\RelWithDebInfo\ZERO_CHECK\ZERO_CHECK.tlog\ZERO_CHECK.lastb
  uildstate".
Сборка проекта "C:\WoTPython\ZERO_CHECK.vcxproj" завершена (целевые объекты по
умолчанию).

Проект "C:\WoTPython\INSTALL.vcxproj" (1) выполняет сборку "C:\WoTPython\ALL_BU
ILD.vcxproj" (3) в узле 1 (целевые объекты по умолчанию).
Проект "C:\WoTPython\ALL_BUILD.vcxproj" (3) выполняет сборку "C:\WoTPython\test
_.vcxproj" (4) в узле 1 (целевые объекты по умолчанию).
PrepareForBuild:
  Создание каталога "test_.dir\RelWithDebInfo\".
  Создание каталога "test_.dir\RelWithDebInfo\test_.tlog\".
InitializeBuildStatus:
  Создание "test_.dir\RelWithDebInfo\test_.tlog\unsuccessfulbuild", так как был
  о задано "AlwaysCreate".
CustomBuild:
  Building Custom Rule C:/Test/sources/CMakeLists.txt
  CMake does not need to re-run because C:/WoTPython/CMakeFiles/generate.stamp
  is up-to-date.
ClCompile:
  C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\1
  4.13.26128\bin\HostX86\x86\CL.exe /c /IC:\WoTPython\include\python2.7 /Zi /no
  logo /W3 /WX- /diagnostics:classic /O2 /Ob1 /Oy- /D WIN32 /D _WINDOWS /D NDEB
  UG /D _CRT_SECURE_NO_WARNINGS /D "CMAKE_INTDIR=\"RelWithDebInfo\"" /D test__E
  XPORTS /D _WINDLL /D _MBCS /Gm- /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope
  /Zc:inline /Fo"test_.dir\RelWithDebInfo\\" /Fd"test_.dir\RelWithDebInfo\vc141
  .pdb" /Gd /TC /analyze- /FC /errorReport:queue C:\Test\sources\test_.c
  test_.c
Link:
  C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\1
  4.13.26128\bin\HostX86\x86\link.exe /ERRORREPORT:QUEUE /OUT:"C:\WoTPython\Rel
  WithDebInfo\test_.pyd" /INCREMENTAL:NO /NOLOGO lib\python27.lib kernel32.lib
  user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib
   comdlg32.lib advapi32.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess
  ='false'" /manifest:embed /DEBUG /PDB:"C:/WoTPython/RelWithDebInfo/test_.pdb"
   /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"C:/WoTPython/Rel
  WithDebInfo/test_.lib" /MACHINE:X86 /SAFESEH  /machine:X86 /DLL test_.dir\Rel
  WithDebInfo\test_.obj
     ╤ючфрхЄё  сшсышюЄхър C:/WoTPython/RelWithDebInfo/test_.lib ш юс·хъЄ C:/WoT
  Python/RelWithDebInfo/test_.exp
test_.obj : error LNK2019: ёё√ыър эр эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы __imp___PyObj
ect_GetDictPtr т ЇєэъЎшш ___Pyx_CLineForTraceback [C:\WoTPython\test_.vcxproj]
C:\WoTPython\RelWithDebInfo\test_.pyd : fatal error LNK1120: эхЁрчЁх°хээ√ї тэх°
эшї ¤ыхьхэЄют: 1 [C:\WoTPython\test_.vcxproj]
Сборка проекта "C:\WoTPython\test_.vcxproj" завершена (целевые объекты по умолч
анию) с ошибкой.

Сборка проекта "C:\WoTPython\ALL_BUILD.vcxproj" завершена (целевые объекты по у
молчанию) с ошибкой.

Сборка проекта "C:\WoTPython\INSTALL.vcxproj" завершена (целевые объекты по умо
лчанию) с ошибкой.


Ошибка сборки.

"C:\WoTPython\INSTALL.vcxproj" (целевой объект по умолчанию) (1) ->
"C:\WoTPython\ALL_BUILD.vcxproj" (целевой объект по умолчанию) (3) ->
"C:\WoTPython\test_.vcxproj" (целевой объект по умолчанию) (4) ->
(Link конечный объект) ->
  test_.obj : error LNK2019: ёё√ыър эр эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы __imp___PyO
bject_GetDictPtr т ЇєэъЎшш ___Pyx_CLineForTraceback [C:\WoTPython\test_.vcxproj
]
  C:\WoTPython\RelWithDebInfo\test_.pyd : fatal error LNK1120: эхЁрчЁх°хээ√ї тэ
х°эшї ¤ыхьхэЄют: 1 [C:\WoTPython\test_.vcxproj]

    Предупреждений: 0
    Ошибок: 2

Прошло времени 00:00:04.13

C:\WoTPython>pause
Для продолжения нажмите любую клавишу . . .

 

 

PS: сейчас зашел в среду. Ошибка    LNK2019    ссылка на неразрешенный внешний символ __imp___PyObject_GetDictPtr в функции ___Pyx_AddTraceback

Edited by Pavel3333

Share this post


Link to post

Short link
Share on other sites

XFW.Native реализует Python/C неполностью, где-то на  70-75%

в данном случае не хватает PyObject_GetDictPtr

Edited by Mixaill

Share this post


Link to post

Short link
Share on other sites

@Mixaill понятно, спасибо.

А с чем связано такое ограничение? урезанность танковой либы?

Share this post


Link to post

Short link
Share on other sites

Сейчас добавлю

 

Python 2.7.7 экспортирует 1054 символов а меня слишком мало :)

Share this post


Link to post

Short link
Share on other sites

@Mixaill а научите? я тоже хочу в кишочках танкового питона копаться, только не знаю чем копать :)

PS: сейчас убрал функцию AddTraceback. Минус стабильность, зато скомпилилось успешно.

Edited by Pavel3333

Share this post


Link to post

Short link
Share on other sites

Спасибо, работает!

@Mixaill сейчас начал тестить пид, они загружаются на 25% быстрее простых py-скриптов. Но есть одно "но" - не печатает трейсбеки.

 

В Cython можно прописать, чтобы печатало трейсы, нехитрой командой cython_runtime.cline_in_traceback=True. Но опять в XFW Native не хватило символа, на этот раз _PyObject_CallNoArg worry.gif

Share this post


Link to post

Short link
Share on other sites

А не работает ли у тебя Cython в режиме Python 3? В Python 2.7 _PyObject_CallNoArg вроде как нет.

Share this post


Link to post

Short link
Share on other sites

@Mixaill PY_MAJOR_VERSION прописана как 2.

 

Но проверок на версии в самом Cython'е нет - 

/* PyObjectCallNoArg.proto */
#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func);
#else
#define __Pyx_PyObject_CallNoArg(func) __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL)
#endif

 

Кстати, такое чувство, что лучше всё-таки снять дефайн COMPILING_IN_CPYTHON и переключиться на PyPy

 

Там всего три режима:

  #define CYTHON_COMPILING_IN_PYPY 0
  #define CYTHON_COMPILING_IN_PYSTON 0
  #define CYTHON_COMPILING_IN_CPYTHON 1

 

Edited by Pavel3333

Share this post


Link to post

Short link
Share on other sites

Приведи лог ошибки, ты не верно указал отсутствующий символ.

 

__Pyx_PyObject_CallNoArg - это не _PyObject_CallNoArg, и он реализуется ниже по файлу.

Share this post


Link to post

Short link
Share on other sites

@Mixaill 

test_.obj : error LNK2019: ёё√ыър эр эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы __imp__PyFunc
tion_Type т ЇєэъЎшш ___Pyx_PyObject_CallNoArg [C:\WoTPython\test_.vcxproj]
C:\WoTPython\Release\test_.pyd : fatal error LNK1120: эхЁрчЁх°хээ√ї тэх°эшї ¤ых
ьхэЄют: 1 [C:\WoTPython\test_.vcxproj]

 

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...