对于 _wdupenv_s 我必须 link 哪个库

which lib do I have to link for _wdupenv_s

我下载python launcher 并尝试独立构建它。

我试过:
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

我知道我必须再添加一个库 link,但我不知道是哪一个。 有人能帮忙吗? 或者提供一种方法来查找哪个库包含指定函数

_wdupenv_s() 显然已在 Visual Studio 2008 年的 CRT (msvcr90) 中引入,但它似乎没有进入系统 CRT ( msvcrt)。 mingw-w64 GCC 通常 link 仅默认为系统 CRT,这就是 ld 找不到符号的原因。

您可以尝试 link 显式 Visual Studio CRT,但请注意这可能会产生不良后果,因为生成的二进制 link 到 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 的未定义引用。

另请注意,在 the build files 中有 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