MinGW 对“_imp__PyExc_TypeError”的未定义引用

undefined reference to `_imp__PyExc_TypeError' with MinGW

我正在使用以下指令使用 MinGW 在 windows 中编译一个 C dll:

"C:\GNAT15\bin\gcc.exe" -shared -c -IC:\Python27\include *.c
"C:\GNAT15\bin\gcc.exe" -shared -Wall -O3 -IC:\Python27\include -L./ -l dependency_lib -LC:\Python27\libs *.o -o mylib.pyd -lpython27 

我在链接过程中遇到了几个这样的错误:

(.text+0x5a2): undefined reference to `_imp__PyExc_TypeError'
(.text+0x69f): undefined reference to `_imp___Py_NoneStruct'

我尝试将 .lib 转换为 .a 但我得到:

/libpython27.a: file format not recognized; treating as linker script

知道我做错了什么吗?非常感谢

看起来 MinGW 编译器需要 python27.a 而不是 python27.lib。但是,.lib 的生成方式非常重要。对我来说,唯一有效的方法是:

  1. 得到python27.dll。我从 "C:\GNAT15\bin\python27.dll" 得到的。它也可能在 "windows/system32".
  2. 使用 pexport 生成 .def 文件。 忘记其他选项,例如使用 sed 它对我不起作用。 运行 pexports.exe python27.dll > python27.def
  3. 使用 MinGW 的 dlltool: dlltool --dllname python27.dll --def python27.def --output-lib libpython27.a

  4. 将生成的 libpython27.a 放在 C:\Python27\libs 中,不要忘记使用 -LC:\Python27\libs[ 将此路径添加到你的 gcc 命令中=11=]

注意:gcc中的-lpython27选项必须在最后。

Source