【问题标题】:Buildozer Numpy RuntimeError: Broken toolchain: cannot link a simple C programBuildozer Numpy RuntimeError: Broken toolchain: cannot link a simple C program
【发布时间】:2018-06-12 19:34:32
【问题描述】:

用 Python 编写我的第一个 Android 应用程序并使用 Buildozer 对其进行打包。因为后面项目需要用到numpy,所以我尝试打包如下测试代码:

import numpy
import kivy
kivy.require('1.0.6')
from kivy.app import App
from kivy.uix.button import Button

class TestApp(App):
    def build(self):
        return Button(text='Hello World')

TestApp().run()

但是,我收到以下错误:

Traceback (most recent call last):
  File "setup.py", line 251, in <module>
    setup_package()
  File "setup.py", line 243, in setup_package
    setup(**metadata)
  File "/home/kivy/Desktop/cam/.buildozer/android/platform/build/build/other_builds/numpy/armeabi-v7a/numpy/numpy/distutils/core.py", line 169, in setup
    return old_setup(**new_attr)
  File "/home/kivy/Desktop/cam/.buildozer/android/platform/build/build/python-installs/myapp/lib/python2.7/distutils/core.py", line 152, in setup
    dist.run_commands()
  File "/home/kivy/Desktop/cam/.buildozer/android/platform/build/build/python-installs/myapp/lib/python2.7/distutils/dist.py", line 953, in run_commands
    self.run_command(cmd)
  File "/home/kivy/Desktop/cam/.buildozer/android/platform/build/build/python-installs/myapp/lib/python2.7/distutils/dist.py", line 972, in run_command
    cmd_obj.run()
  File "/home/kivy/Desktop/cam/.buildozer/android/platform/build/build/other_builds/numpy/armeabi-v7a/numpy/numpy/distutils/command/build_ext.py", line 59, in run
    self.run_command('build_src')
  File "/home/kivy/Desktop/cam/.buildozer/android/platform/build/build/python-installs/myapp/lib/python2.7/distutils/cmd.py", line 326, in run_command
    self.distribution.run_command(command)
  File "/home/kivy/Desktop/cam/.buildozer/android/platform/build/build/python-installs/myapp/lib/python2.7/distutils/dist.py", line 972, in run_command
    cmd_obj.run()
  File "/home/kivy/Desktop/cam/.buildozer/android/platform/build/build/other_builds/numpy/armeabi-v7a/numpy/numpy/distutils/command/build_src.py", line 153, in run
    self.build_sources()
  File "/home/kivy/Desktop/cam/.buildozer/android/platform/build/build/other_builds/numpy/armeabi-v7a/numpy/numpy/distutils/command/build_src.py", line 164, in build_sources
    self.build_library_sources(*libname_info)
  File "/home/kivy/Desktop/cam/.buildozer/android/platform/build/build/other_builds/numpy/armeabi-v7a/numpy/numpy/distutils/command/build_src.py", line 299, in build_library_sources
    sources = self.generate_sources(sources, (lib_name, build_info))
  File "/home/kivy/Desktop/cam/.buildozer/android/platform/build/build/other_builds/numpy/armeabi-v7a/numpy/numpy/distutils/command/build_src.py", line 386, in generate_sources
    source = func(extension, build_dir)
  File "numpy/core/setup.py", line 686, in get_mathlib_info
    raise RuntimeError("Broken toolchain: cannot link a simple C program")
RuntimeError: Broken toolchain: cannot link a simple C program


  STDERR:
# Command failed: /usr/bin/python -m pythonforandroid.toolchain create --dist_name=myapp --bootstrap=sdl2 --requirements=kivy,numpy --arch armeabi-v7a --copy-libs --color=always --storage-dir=/home/kivy/Desktop/cam/.buildozer/android/platform/build
# 
# Buildozer failed to execute the last command
# The error might be hidden in the log above this error
# Please read the full log, and search for it before
# raising an issue with buildozer itself.
# In case of a bug report, please add a full log with log_level = 2

另外,这是我的buildozer.spec 文件:

title = My Application
package.name = myapp
package.domain = org.test
source.dir = .
source.include_exts = py,png,jpg,kv,atlas
version = 1.0

requirements = kivy,numpy

orientation = portrait
osx.kivy_version = 1.9.1
fullscreen = 0
android.api = 19
android.sdk = 20
android.ndk = 9c
android.arch = armeabi-v7a
log_level = 2
warn_on_root = 1

请注意,当我从 python 代码中删除“import numpy”并从 buildozer.spec 文件的需求列表中删除“numpy”时,我的代码被完美打包。我在预先安装了 Buildozer 的 VM Virtual Box 上运行它。

此外,不只是 Numpy 给我这个问题 - OpenCV 给了我完全相同的错误。如果需要,将为此单独发布。

【问题讨论】:

    标签: android python numpy kivy buildozer


    【解决方案1】:

    此问题在 Python for Android (p4a) 项目 here 中报告,不知道它对于稳定的 p4a 是否实际存在。不过,您可以通过链接找到PR that fixes issue。我没有测试过,但不同的人说它有效。

    您可以尝试使用此修复程序构建 numpy,这就是您需要的:

    1. 确保使用命令清除当前构建过程中剩下的所有内容:

      buildozer distclean

    2. 使用命令克隆 p4a 分支:

      git clone -b p4a_numpy_fix https://github.com/mahomahomaho/python-for-android fix-numpy

    3. 更改您的 buildozer.spec 以使用此 p4a 的克隆版本(使用您的实际路径):

      p4a.source_dir = /home/ubuntu/p4a_numpy_fix

    然后再次运行构建 apk。如果一切正常,您将能够构建 apk。如果不是,您将面临另一个错误,这里不保证:(

    【讨论】:

    • 在第 2 步,我收到这条消息:fatal: Remote branch p4a_numpy_fix not found in upstream origin
    • 自 2018 年 1 月起,您应该将步骤 2 替换为 git clone git://github.com/kivy/python-for-android,因为 @inclement 合并了您的分支。
    • 警告。此命令buildozer distclean 清除所有缓存的工具,例如 SDK 和 NDK,这些工具以后下载起来很麻烦。
    • 您的解决方案运行良好,但还有另一个错误。你能帮我解决这个问题吗“错误:'struct lconv'没有名为'decimal_point'的成员”
    猜你喜欢
    • 2015-03-01
    • 2014-04-18
    • 2019-09-18
    • 1970-01-01
    • 2021-09-21
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    相关资源
    最近更新 更多