V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
whx20202
V2EX  ›  Python

为什么在 Mac 上编译 Python C 扩展,会自动带上 --arch i386?

  •  
  •   whx20202 · 2019-02-02 22:17:43 +08:00 · 2718 次点击
    这是一个创建于 2119 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我在 Mac 上编写一个 python C 扩展,setup.py 是这样的:

    # file: setup.py
    from distutils.core import setup, Extension
    
    extra_objects = ["/Users/rrg/Documents/test/aliyun-log-c-sdk/build/Debug/lib/liblog_c_sdk_static.a"]
    
    module1 = Extension('pycproducer',
                        sources=['pycproducer.c'],
                        extra_objects=extra_objects)
    
    setup(name='pycproducer',
          version='1.0',
          description='This is a Math package',
          ext_modules=[module1])
    

    其中liblog_c_sdk_static是我要带上的静态库。但是当我运行python setup.py install的时候,报了这个错:

    第一行估计是编译的命令:

    cc -bundle -undefined dynamic_lookup -arch x86_64 -arch i386 -Wl,-F. build/temp.macosx-10.13-intel-2.7/pycproducer.o /Users/rrg/Documents/test/aliyun-log-c-sdk/build/Debug/lib/liblog_c_sdk_static.a -o build/lib.macosx-10.13-intel-2.7/pycproducer.so

    后两行是 warning:

    ld: warning: The i386 architecture is deprecated for macOS (remove from the Xcode build setting: ARCHS)

    ld: warning: ignoring file /Users/rrg/Documents/test/aliyun-log-c-sdk/build/Debug/lib/liblog_c_sdk_static.a, file was built for archive which is not the architecture being linked (i386): /Users/rrg/Documents/test/aliyun-log-c-sdk/build/Debug/lib/liblog_c_sdk_static.a

    我是这么理解的:

    1. python 的distutils给我生成 gcc 命令,然后生成 gcc 命令里,带了-arch x86_64 -arch i386两个架构。
    2. 我的静态库,liblog_c_sdk_static.a是只支持 x86_64 的,我用了lipo -info命令看过,显示: architecture: x86_64
    3. 然后 xcode 发现我自己的代码是 -arch x86_64 -arch i386,但是静态库只有 x86_64,于是给我告警,放弃链接静态库。

    请问有大佬知道现在怎么办吗?

    我理解是应该有个地方,比如在 python 的distutils里,有个地方指定屏蔽某个 architecture,或者在 gcc 的全局变量里屏蔽也行。

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2785 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 15:09 · PVG 23:09 · LAX 07:09 · JFK 10:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.