python - 在 setup.py 中编译 C++ 代码时如何删除 -arch i386 标志?
问题描述
我想为 Python 编译一个 C++ 扩展。问题是 C++ 程序仅适用于 x86_64 架构,但默认编译标志包括 -arch i386。
setup.py 看起来像:
from distutils.core import setup, Extension
integral_ext = Extension('mod._mod',
sources = ['wrap.cpp'],
extra_compile_args = ['-mmacosx-version-min=10.7', '-std=c++11', '-stdlib=libc++'])
setup(
ext_modules = [integral_ext],
)
编译时,终端显示命令为:
/usr/bin/clang -fno-strict-aliasing -Wsign-compare -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -arch i386 -arch x86_64 -g -I/Library/Frameworks/Python.framework/Versions/3.6/include/python3.6m -c wrap.cpp -o build/temp.macosx-10.6-intel-3.6/wrap.o -mmacosx-version-min=10.7 -std=c++11 -stdlib=libc++
由于 C++ 中的一些 static_assert 代码需要 x86_64,这将失败。删除 -arch i386 标志后,我可以通过命令行成功编译它。但是,我正在编写一个库供其他人使用,并且我想让它变得简单,以便用户可以通过运行 python3 setup.py install 的标准方式来安装它。
最重要的是,我无法更改 C++ 文件,我想在 setup.py 中做一些事情以使其编译。谢谢!
解决方案
当我在开头包含以下几行时,错误消失了setup.py
:
import os
os.environ['CFLAGS'] = '-fno-strict-aliasing -dynamic -DNDEBUG -g -fwrapv -O3 -c'
os.environ['LDFLAGS'] = '-arch x86_64 '
运行时的编译输出python3 setup.py install
为:
/usr/bin/clang -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fno-strict-aliasing -dynamic -DNDEBUG -g -fwrapv -O3 -c -I/Library/Frameworks/Python.framework/Versions/3.6/include/python3.6m -c qtwinclient_wrap.cpp -o build/temp.macosx-10.6-intel-3.6/qtwinclient_wrap.o -mmacosx-version-min=10.7 -std=c++11 -stdlib=libc++
/usr/bin/clang++ -bundle -undefined dynamic_lookup -arch i386 -arch x86_64 -g -arch x86_64 -fno-strict-aliasing -dynamic -DNDEBUG -g -fwrapv -O3 -c build/temp.macosx-10.6-intel-3.6/qtwinclient_wrap.o -o build/lib.macosx-10.6-intel-3.6/qtwinclient/_qtwinclient.cpython-36m-darwin.so -lc++ -mmacosx-version-min=10.7 -Lqtwinclient -L/Library/Frameworks/Python.framework/Versions/3.6/lib/ -lqtwinclient_c -lpython3.6
clang: warning: build/temp.macosx-10.6-intel-3.6/qtwinclient_wrap.o: 'linker' input unused [-Wunused-command-line-argument]
clang: warning: -lc++: 'linker' input unused [-Wunused-command-line-argument]
clang: warning: -lqtwinclient_c: 'linker' input unused [-Wunused-command-line-argument]
clang: warning: -lpython3.6: 'linker' input unused [-Wunused-command-line-argument]
clang: warning: argument unused during compilation: '-bundle' [-Wunused-command-line-argument]
clang: warning: argument unused during compilation: '-undefined dynamic_lookup' [-Wunused-command-line-argument]
clang: warning: argument unused during compilation: '-g' [-Wunused-command-line-argument]
clang: warning: argument unused during compilation: '-fno-strict-aliasing' [-Wunused-command-line-argument]
clang: warning: argument unused during compilation: '-D NDEBUG' [-Wunused-command-line-argument]
clang: warning: argument unused during compilation: '-g' [-Wunused-command-line-argument]
clang: warning: argument unused during compilation: '-fwrapv' [-Wunused-command-line-argument]
clang: warning: argument unused during compilation: '-O3' [-Wunused-command-line-argument]
clang: warning: argument unused during compilation: '-mmacosx-version-min=10.7' [-Wunused-command-line-argument]
clang: warning: argument unused during compilation: '-Lqtwinclient' [-Wunused-command-line-argument]
clang: warning: argument unused during compilation: '-L/Library/Frameworks/Python.framework/Versions/3.6/lib/' [-Wunused-command-line-argument]
编译成功,但多行警告clang: warning: argument unused during compilation
仍然看起来很难看。如果有人可以建议如何摆脱警告,将不胜感激。
推荐阅读
- c# - 采用 EF 模型并将其转换为数据表?
- javascript - 我们可以从提交表单中发布 getelement.id('').innerhtml 吗?
- c - 使用 sscanf 和括号将字符串分解成小块
- rspec - 为什么我在执行 Watir 脚本时收到 Uncaught TypeError: Cannot read property 'domNode' of null` from Tableau?
- php - 根据页面输入将数字密码转换为字母数字密码
- mysql - 就如何构建我的查询和设置我的映射向一个假人提供建议
- scripting - 有堆栈溢出的 API 吗?
- unity3d - 在 Unity3D 中使用 Farseer/Box2D 的 DebugDraw 的最佳方式?
- c# - [TestMethod] 必须是公开的吗?如果不是,会有什么后果?
- python - 在让其他代码运行的同时获取用户输入