在Cygwin中使用dlltool构建64位libpython27.a

5 投票
2 回答
4288 浏览
提问于 2025-04-17 02:43

我正在尝试在一台64位的Win7机器上使用cygwin构建一个python扩展的DLL(因为cygwin只能以32位进程运行,所以这实际上是跨平台编译)。

我用dlltool从python27.dll自己创建了libpython27.a(具体步骤可以参考这里),但是在链接阶段构建失败,提示
在寻找-lpython27时跳过不兼容的c:\Python27\libs/libpython27.a
这个错误和这里报告的完全一样(那个人最后转向使用MSVC编译器了……)。

更多信息:
- 使用的是Active Python 2.7.2,win64,x64
- 最新版本的cygwin,使用的是/usr/bin/x86_64-w64-mingw32-g++.exe编译器

有没有人知道这是否被支持?
有没有我遗漏的使用dlltool的方法?

(我确实在这里找到了使用
dlltool --as-flags=--64 -m i386:x86-64 -k -l libpython27.a -d python.def
的指导,但这样做时我收到了"invalid bfd target"的错误信息)

谢谢!

更新:我相信这是可以做到的,因为Enthought python包含了这样的文件。我想为更常见的发行版创建一个,因为它们不包含这个文件。

2 个回答

0

我不确定这对你有多大帮助,但在你链接的页面底部,有一个指向这里的链接,里面提到:

不要使用MinGW-w64。你会注意到,Python的MinGW导入库(比如libpython27.a)在AMD64版本的Python中是缺失的。这是故意的。不要试图用dlltool自己制作一个。 目前还没有官方的MinGW-w64版本,它仍然处于“测试版”,被认为是不稳定的,尽管你可以从例如TDM-GCC获取一个64位的版本。此外,mingw运行时可能会和MSVC运行时发生冲突;这种情况可能出现在你意想不到的地方,比如g++或gfortran的运行时库中。为了安全起见,暂时避免使用MinGW-w64。

1

问题在于你使用的是32位的dlltool。很可能是在C:\MinGW\bin这个路径下,而不是C:\MinGW64\bin。你可以修改你的路径,或者直接运行64位的工具,方法如下:

C:\MinGW64\bin\dlltool -v --dllname python27.dll --def python27.def --output-lib libpython27.a

撰写回答