какую библиотеку я должен связать для _wdupenv_s - PullRequest
0 голосов
/ 02 мая 2020

Я загружаю python лаунчер и пытаюсь собрать его самостоятельно.

Я пробовал:
gcc launcher.c -lversion -o py.exe
gcc launcher.o -lversion -lWs2_32 -o py.exe

с обоими posix / win32 mingw-w64 и с той же ошибкой:

(.text+0x1b02): undefined reference to `__imp__wdupenv_s'
collect2.exe: error: ld returned 1 exit status

Я знаю, что должна быть еще одна библиотека, которую я должен связать, но я не знаю, какая именно. Может ли кто-нибудь помочь? или предоставьте метод для определения, какая библиотека содержит указанную функцию

1 Ответ

1 голос
/ 02 мая 2020

_wdupenv_s() было очевидно введено в CRT Visual Studio 2008 ( msvcr90 ), но, похоже, оно не вошло в CRT системы ( msvcrt ). GCC mingw-w64 обычно по умолчанию связывают только с CRT системы, поэтому ld не может найти символ.

Вы можете попробовать явно установить связь с CRT Visual Studio, но учтите, что это может привести к ошибкам. последствия, потому что результирующие двоичные ссылки как на CRT, так и на смешивающие CRT, как известно, вызывают проблемы.

gcc -municode launcher.c -o launcher.exe -lversion -lmsvcr120

Если ваша цепочка инструментов имеет эту функцию (ту, которая создана в MSYS2), вы можете заменить системную CRT на Visual Studio CRT полностью:

gcc -municode -mcrtdll=msvcr120 launcher.c -o launcher.exe -lversion

Я также добавил аргумент -municode, в противном случае я получаю неопределенную ссылку на WinMain.

Также обратите внимание, что в файлы сборки есть 4 двоичных файла, построенных из launcher.c, каждый со своим собственным набором определений:

  • [...] -o pylauncher.exe -D_CONSOLE
  • [...] -o pywlauncher.exe -D_WINDOWS
  • [...] -o venvlauncher.exe -D_CONSOLE -DVENV_REDIRECT
  • [...] -o venvwlauncher.exe -D_WINDOWS -DVENV_REDIRECT

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

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

copy /y  ..\Include\patchlevel.h pythonnt_rc.h
echo #define FIELD3 106 >> pythonnt_rc.h
echo #define MS_DLL_ID "10.0" >> pythonnt_rc.h
echo #define PYTHON_DLL_NAME "foopython3.dll" >> pythonnt_rc.h
windres -I..\Include -I. pylauncher.rc -o pylauncher.o
gcc -municode -mcrtdll=msvcr120 -D_CONSOLE launcher.c pylauncher.o -o pylaunc
her.exe -lversion
...