Kivy 编译失败,错误如下。 原因是在SDL2_mixer
版本 2.0.2 中删除/重命名了一些标志,特别是MIX_INIT_MODPLUG
和MIX_INIT_FLUIDSYNTH
从SDL_mixer.h
中删除。
我愿意尝试修复,但大概我们想要保持向后兼容性,所以我的想法是如果它们不存在于标头中,则在本地重新定义这些标志。
gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -march=armv8-a -O2 -pipe -fstack-protector-strong --param=ssp-buffer-size=4 -march=armv8-a -O2 -pipe -fstack-protector-strong --param=ssp-buffer-size=4 -march=armv8-a -O2 -pipe -fstack-protector-strong --param=ssp-buffer-size=4 -fPIC -Ikivy/include -I/usr/include/SDL2 -I/usr/local/include/SDL2 -I/usr/include/SDL2 -I/usr/include/SDL2 -I/usr/include/python3.6m -c kivy/core/audio/audio_sdl2.c -o build/temp.linux-aarch64-3.6/kivy/core/audio/audio_sdl2.o
kivy/core/audio/audio_sdl2.c: In function '__pyx_f_4kivy_4core_5audio_10audio_sdl2_mix_init':
kivy/core/audio/audio_sdl2.c:1647:63: error: 'MIX_INIT_MODPLUG' undeclared (first use in this function); did you mean 'MIX_INIT_MOD'?
__pyx_v_want_flags = (__pyx_v_want_flags | ((MIX_INIT_MOD | MIX_INIT_MODPLUG) | MIX_INIT_FLUIDSYNTH));
^~~~~~~~~~~~~~~~
MIX_INIT_MOD
kivy/core/audio/audio_sdl2.c:1647:63: note: each undeclared identifier is reported only once for each function it appears in
kivy/core/audio/audio_sdl2.c:1647:83: error: 'MIX_INIT_FLUIDSYNTH' undeclared (first use in this function); did you mean 'MIX_INIT_MID'?
__pyx_v_want_flags = (__pyx_v_want_flags | ((MIX_INIT_MOD | MIX_INIT_MODPLUG) | MIX_INIT_FLUIDSYNTH));
^~~~~~~~~~~~~~~~~~~
MIX_INIT_MID
kivy/core/audio/audio_sdl2.c: In function '__pyx_pf_4kivy_4core_5audio_10audio_sdl2_9MusicSDL2_extensions':
kivy/core/audio/audio_sdl2.c:4936:69: error: 'MIX_INIT_MODPLUG' undeclared (first use in this function); did you mean 'MIX_INIT_MOD'?
__pyx_t_2 = ((__pyx_v_4kivy_4core_5audio_10audio_sdl2_mix_flags & MIX_INIT_MODPLUG) != 0);
^~~~~~~~~~~~~~~~
MIX_INIT_MOD
error: command 'gcc' failed with exit status 1
这是 v2.0.2 中SDL_mixer.h
的新定义:
typedef enum
{
MIX_INIT_FLAC = 0x00000001,
MIX_INIT_MOD = 0x00000002,
MIX_INIT_MP3 = 0x00000008,
MIX_INIT_OGG = 0x00000010,
MIX_INIT_MID = 0x00000020
} MIX_InitFlags;
和之前的比较:
typedef enum
{
MIX_INIT_FLAC = 0x00000001,
MIX_INIT_MOD = 0x00000002,
MIX_INIT_MODPLUG = 0x00000004,
MIX_INIT_MP3 = 0x00000008,
MIX_INIT_OGG = 0x00000010,
MIX_INIT_FLUIDSYNTH = 0x00000020
} MIX_InitFlags;
我 100% 肯定没有人使用fluidsynth。 如果您直接提供补丁,我们将合并它。
你在哪里输入新定义? 请和我一起裸露。 我是新来的。
看起来有人在这里修复了: https :
ArchLinux Kivy 包以某种方式设法解决了这个编译问题:
python-kivy 1.10.0 包依赖于 sdl2_mixer 2.0.2,它可以在没有提到的补丁的情况下工作。
我试图在 Python 3 虚拟环境中安装 Kivy,其中的 requirements.txt 文件包含:
Cython==0.25.2
Kivy==1.10.0
并以相同的error: ‘MIX_INIT_MODPLUG’ undeclared (first use in this function); did you mean ‘MIX_INIT_MOD’?
错误失败
从存储库安装软件包后: sudo pacman -S python-kivy
并添加安装 Kivy 的全局 Python 安装路径:
PYTHONPATH=/usr/lib/python3.6/site-packages/:/usr/local/lib/python3.6/site-packages/ python3 main.py
,Kivy 模块加载成功。
那很有意思。 不幸的是,我需要编译最新的 master 分支,因为我在 Raspberry Pi 上运行 Arch,如果我使用存储库中的 1.10.0 版本,性能会很糟糕。
实际上,通过makepkg -s && makepkg --skipinteg
从 master 分支构建 python-kivy Arch 包失败并出现相同的错误。
将补丁应用到PKGBUILD可以在 x86_64 桌面上构建 master Kivy
为 ARM 构建应该和桌面一样工作,只需要更新相应的 PKGBUILD 文件:
https://archlinuxarm.org/packages/arm/python-kivy
https://archlinuxarm.org/packages/arm/sdl_mixer
将 URL 中的“arm”替换为您拥有的 Raspberry Pi 的 ARM 版本:
树莓派 1 - armv6
树莓派 2 - armv7
树莓派 3 - armv8
但是,我看到 ArchLinux for ARM 中的 sdl_mixer 包是 1.2.12-5 ,也需要更新。
已关闭 #5459
这在 MacOS High Sierra 上仍然存在
@duaneking
如果您安装开发版本,如 pip install https://github.com/kivy/kivy/archive/master.zip (请参阅 https://kivy.org/docs/installation/installation-osx.html),那么它可以在高塞拉。
对我来说不是一个选择; 我现在正在寻找非 kiva 选项,因为 HS 已经存在了足够长的时间,如果社区不关心运送/维护它,那么我不应该让自己依赖它。
是否有任何更改可以通过此修复程序发布 Kivy 版本? 由于 Ubuntu 18.04 刚刚发布,这将影响到我们几乎 95% 的 Linux 用户群。
安装 Kivy 开发版适用于 High Sierra。 谢谢幻想!
最有用的评论
这在 MacOS High Sierra 上仍然存在