【问题标题】:Using libspotify .dll/.lib files in MinGW32 compiling pySpotify在 MinGW32 编译 pySpotify 中使用 libspotify .dll/.lib 文件
【发布时间】:2012-12-01 19:04:08
【问题描述】:

在 Windows PC 上使用 MinGW32 我正在尝试编译 pySpotify。第一个错误是缺少libspotify/api.h。我通过将适当的文件夹从libspotify 复制到C:\MinGW\include修复这个问题。但是现在dllwrap 现在失败了ld linking. 二进制文件Spotify 分发是libspotify.dlllibspotify.lib. 无论我把它们放在哪里(pySpotify 文件夹/子文件夹,临时构建文件夹/子文件夹和 MinGW 文件夹/子文件夹) 或我将它们命名为 (.a, .o & .so)仍然显示相同的错误消息。

相关错误是:

C:\MinGW\bin\dllwrap.exe -mdll -static --output-lib build\temp.win32-2.7\Release\src\lib_spotify.a --def build\temp.win32-2.7\Release\src\_spotify.def -s build\temp.win32-2.7\Release\src\module.o build\temp.win32-2.7\Release\src\session.o build\temp.win32-2.7\Release\src\link.o build\temp.win32-2.7\Release\src\track.obuild\temp.win32-2.7\Release\src\album.o build\temp.win32-2.7\Release\src\albumbrowser.o build\temp.win32-2.7\Release\src\artist.o build\temp.win32-2.7\Release\src\artistbrowser.o build\temp.win32-2.7\Release\src\search.o build\temp.win32-2.7\Release\src\playlist.o build\temp.win32-2.7\Release\src\playlistcontainer.o build\temp.win32-2.7\Release\src\playlistfolder.o build\temp.win32-2.7\Release\src\image.o build\temp.win32-2.7\Release\src\user.o build\temp.win32-2.7\Release\src\pyspotify.o build\temp.win32-2.7\Release\src\toplistbrowser.o -LC:\Python26\libs -LC:\Python26\PCbuild -lspotify -lpython26 -lmsvcr90 -o build\lib.win32-2.7\spotify\_spotify.pyd
c:/mingw/bin/../lib/gcc/mingw32/4.7.2/../../../../mingw32/bin/ld.exe: cannot find -lspotify
collect2.exe: error: ld returned 1 exit status
dllwrap: gcc exited with status 1
error: command 'dllwrap' failed with exit status 1

bok says on github那个:

您需要在包含路径中添加 API 标头(在编译器选项中添加 -I~\libspotify\include 之类的内容)和库路径中的共享库(在链接器中添加 -L~\libspotify\lib选项)。这将允许编译器找到必要的包含文件,并让您的链接器找到必要的二进制对象。

但是,distutils 扩展类似乎已被弃用,并且很难找到相关文档(我相信这是需要自定义编译器选项的地方)。感谢~ 可能需要更改为%USERPROFILE% 或类似名称。同样,%PYTHONPATH%\Lib\distutils\distutils.cfg 除了[build] compiler=mingw32 节之外几乎没有文档。这使得编辑编译/链接命令及其选项无法更改。

如何在 Windows 上编译 pySpotify?

编辑:

通过使用 Python 2.6 并将 libspotify.dll/libspotify.lib 复制到 C:\Python26\PCbuild 并将它们重命名为 spotify.dll/libspotify.lib 我现在收到来自 ld 的另一条错误消息:

C:\MinGW\bin\dllwrap.exe -mdll -static --output-lib build\temp.win32-2.6\Release\src\lib_spotify.a --def build\temp.win32-2.6\Release\src\_spotify.def -s build\temp.win32-2.6\Release\src\module.o build\temp.win32-2.6\Release\src\session.o build\temp.win32-2.6\Release\src\link.o build\temp.win32-2.6\Release\src\track.obuild\temp.win32-2.6\Release\src\album.o build\temp.win32-2.6\Release\src\albumbrowser.o build\temp.win32-2.6\Release\src\artist.o build\temp.win32-2.6\Release\src\artistbrowser.o build\temp.win32-2.6\Release\src\search.o build\temp.win32-2.6\Release\src\playlist.o build\temp.win32-2.6\Release\src\playlistcontainer.o build\temp.win32-2.6\Release\src\playlistfolder.o build\temp.win32-2.6\Release\src\image.o build\temp.win32-2.6\Release\src\user.o build\temp.win32-2.6\Release\src\pyspotify.o build\temp.win32-2.6\Release\src\toplistbrowser.o -LC:\Python26\libs -LC:\Python26\PCbuild -lspotify -lpython26 -lmsvcr90 -o build\lib.win32-2.6\spotify\_spotify.pyd
_spotify.exp: file not recognized: File format not recognized
collect2.exe: error: ld returned 1 exit status
dllwrap: gcc exited with status 1
error: command 'dllwrap' failed with exit status 1

【问题讨论】:

  • 也许 mingw 的 ld 没有正确读取绝对路径?也就是说,尝试将 libspotify 移动到相对位置,看看是否没有帮助。
  • 嗨 Nik,感谢您的建议 - 但我尝试复制到我能找到的每个文件夹/子文件夹无济于事:“无论我把它们放在哪里(pySpotify 文件夹/子文件夹,临时构建文件夹/subfolders 和 MinGW 文件夹/子文件夹)。”

标签: python c spotify cpython


【解决方案1】:

目前无法访问 mingw 安装,我可以提出一些建议。

首先,众所周知,ld 对参数的顺序很挑剔。奇怪的是,当我用谷歌搜索“ld 参数顺序”时,我得到了一堆页面,暗示顺序无关紧要,但我已经被这个烧了好几次了。我在以下参数顺序方面取得了最大的成功:

  1. 切换到ld(即-Wall
  2. 图书馆搜索路径(即-LPATH
  3. 目标文件
  4. 库(即-lspotify

我注意到您的链接器输出中有一些对 amd64 的引用。我不确定你是如何编译你拥有的其他目标文件的,但由于 libspotify 在 Windows 上是 32 位的,我猜在这里混合 32/64 位不会很好。

我能想到的最后一件事是,也许 dll 扩展名让ld 感到困惑,您是否尝试将文件名更改为libspotify.so?我知道这有点像在黑暗中拍摄,但否则我不知道如何进一步帮助您。

【讨论】:

  • 我尝试将这两个文件重命名为 .so、.a 和 .o。当我尝试使用 MinGW64 时,它抱怨它无法编译,所以我现在改用 MinGW(在 64 位 Windows 上)。使用构建脚本,我无法访问参数排序,这是问题的一部分。
【解决方案2】:

我猜您正在尝试将 64 位版本的 pyspotify 与 32 位版本的 libspotify 链接。尝试重建 pyspotify 将 -m32 添加到 CFLAGS 和 CXXFLAGS

【讨论】:

  • 我不知道如何使用 setup.py(pySpotify 的构建脚本)访问 CFLAG/CXXFLAGS。
  • CFLAGS=-m32 python setup.py 应该可以解决问题。还要确保您已经安装了 32 位 python。请注意,问题很可能反过来:也许 pyspotify 是用 32 位编译的,而 libspotify 是 64 位的。
  • 'CFLAGS' is not recognized as an internal or external command, operable program or batch file. 是您在 Windows 上收到的错误(知道这适用于 *nix)。我要去玩环境变量并检查 python 是 32 位。
  • 现在构建路径是 build\temp.win32-2.6(使用 32 位 Python 2.6)但仍然没有运气(再次使用 dllwrap)。
  • 除了 Windows 本身之外,现在一切都是 32 位的(更新了问题中的错误消息以反映这一点)。尝试将 -m32 添加到 CFLAGS 环境变量中,没有发现任何区别。
【解决方案3】:

我添加了一些说明,说明如何在问题的实际票证上编译它。让我知道它是否对您有帮助!

https://github.com/mopidy/pyspotify/issues/63

【讨论】:

  • 请注意 link-only answers 是不鼓励的,所以答案应该是寻找解决方案的终点(与另一个中途停留的参考相比,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的概要,并保留链接作为参考。
  • 我刚注册了一个帐户,我可以发布的最大链接数量是两个。我在解决方案中有几个链接,因此我认为让所有信息完好无损的最佳方法是在我发布解决方案时发布指向实际票证的链接。
  • 重点是在此处发布解决方案(而不是在其他地方发布解决方案的链接:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多