当前位置: 首页 > 知识库问答 >
问题:

如何告诉distutils使用gcc?

严宏旷
2023-03-14

我想用Cython包装一个包含C和OpenMP代码的测试项目,并通过一个setup.py文件用distutils构建它。我的文件内容是这样的:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
from Cython.Distutils import build_ext


modules = [Extension("Interface",
                     ["Interface.pyx", "Parallel.cpp"],
                     language = "c++",
                     extra_compile_args=["-fopenmp"],
                     extra_link_args=["-fopenmp"])]

for e in modules:
    e.cython_directives = {"embedsignature" : True}

setup(name="Interface",
     cmdclass={"build_ext": build_ext},
     ext_modules=modules)

-fopenmp标志与gcc一起用于编译和链接OpenMP。然而,如果我只是调用

cls ~/workspace/CythonOpenMP/src $ python3 setup.py build

无法识别此标志,因为编译器为clang:

running build
running build_ext
skipping 'Interface.cpp' Cython extension (up-to-date)
building 'Interface' extension
cc -Wno-unused-result -fno-common -dynamic -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -I/usr/local/include -I/usr/local/opt/sqlite/include -I/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/include/python3.3m -c Interface.cpp -o build/temp.macosx-10.8-x86_64-3.3/Interface.o -fopenmp
clang: warning: argument unused during compilation: '-fopenmp'
cc -Wno-unused-result -fno-common -dynamic -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -I/usr/local/include -I/usr/local/opt/sqlite/include -I/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/include/python3.3m -c Parallel.cpp -o build/temp.macosx-10.8-x86_64-3.3/Parallel.o -fopenmp
clang: warning: argument unused during compilation: '-fopenmp'
Parallel.cpp:24:10: warning: unknown pragma ignored [-Wunknown-pragmas]
        #pragma omp parallel for
                ^
1 warning generated.
c++ -bundle -undefined dynamic_lookup -L/usr/local/lib -L/usr/local/opt/sqlite/lib build/temp.macosx-10.8-x86_64-3.3/Interface.o build/temp.macosx-10.8-x86_64-3.3/Parallel.o -o build/lib.macosx-10.8-x86_64-3.3/Interface.so -fopenmp
ld: library not found for -lgomp
clang: error: linker command failed with exit code 1 (use -v to see invocation)
error: command 'c++' failed with exit status 1

我尝试指定gcc失败:

cls ~/workspace/CythonOpenMP/src $ python3 setup.py build --compiler=g++-4.7
running build
running build_ext
error: don't know how to compile C/C++ code on platform 'posix' with 'g++-4.7' compiler

如何告诉distutils使用gcc?

共有3个答案

端木渝
2023-03-14

我只是看了一下distutils源代码,并且--compiler选项需要unix、msvc、cygwin、mingw32、bcpp或emx。它通过检查CC环境变量来检查所需的编译器名称。尝试这样调用构建:

CC=gcc python setup.py build

您不需要设置CXX,它不会检查这一点。

罗法
2023-03-14

以防其他人在Windows下面临同样的问题(CC环境变量不会产生任何影响):

  • 创建文件"C:\Python27\Lib\distutils\distutils.cfg"并将其写入:

代码:

[build]
compiler = mingw32
  • 从文件"C:\Python27\Lib\distutils\cygwinccompiler.py"中删除"-mno-cygwin"gcc选项的所有实例:

这个:

    self.set_executables(compiler='gcc -mno-cygwin -O -Wall',
                         compiler_so='gcc -mno-cygwin -mdll -O -Wall',
                         compiler_cxx='g++ -mno-cygwin -O -Wall',
                         linker_exe='gcc -mno-cygwin',
                         linker_so='%s -mno-cygwin %s %s'
                                    % (self.linker_dll, shared_option,
                                       entry_point))

变成这样:

self.set_executables(compiler='gcc -O -Wall',
                     compiler_so='gcc -mdll -O -Wall',
                     compiler_cxx='g++ -O -Wall',
                     linker_exe='gcc',
                     linker_so='%s %s %s'
                                % (self.linker_dll, shared_option,
                                   entry_point))

希望这会有所帮助,即使它与OP的实际需求没有直接关系(但仍然与问题的标题相关…)

贲俊才
2023-03-14

尝试使用os.environ.从setup.py内部设置"CC"环境变量

 类似资料:
  • 问题内容: 我想用Cython包装一个包含C ++和OpenMP代码的测试项目,并通过文件与distutils一起构建它。我文件的内容如下所示: 该标志与gcc一起用于针对OpenMP进行编译和链接。但是,如果我只是调用 由于编译器是clang,因此无法识别此标志: 我尝试指定gcc失败: 如何告诉distutils使用gcc? 问题答案: 尝试使用os.environ从setup.py内部设置“

  • 问题内容: 我有一个click事件发生在我的自定义指令范围之外,因此,我使用jQuery.click()侦听器并在我的范围内调用一个函数,而不是使用“ ng- click”属性,如下所示: close()是一个简单的函数,如下所示: 在我看来,我有一个绑定到isOpen的“ ng-show”元素,如下所示: 调试时,我发现正在调用close(),isOpen被更新为false,但是AngularJ

  • 问题内容: 我想编写一个函数,该函数接收 几种 类型的结构并从JSON解组。为此,我有另一组带有预定义签名的函数,这些函数返回struct实例,但是由于每个函数都返回不同类型的struct,因此函数签名具有的返回类型。 当我发送json.Unmarshal一个具体的结构时,它可以按照我的预期工作,但是当我发送相同的结构时,它将其转换为地图。 这是描述问题的简化示例代码: https://play.

  • 问题内容: pyximport非常方便,但是我不知道如何让它参与Cython的C ++语言选项。从命令行运行。你如何用pyximport达到等效?谢谢! 问题答案: 使Cython创建C ++文件的一种方法是使用pyxbld文件。例如,创建包含以下内容:

  • 一个简单的问题,即使经过几个小时的尝试和搜索,我也无法弄清楚: 我已经安装了Java6和7。 所有项目模块均设置为使用1.6 设置为 设置未执行任何操作 在命令行中将1.6识别为其JDK 重新启动IntelliJ和/或计算机没有更改行为 是否有一个设置来避免Java1.7被调用?

  • 我们的客户正在为内部应用程序使用自己的根CA。证书在Windows密钥库中,但不在Java密钥库中。如何让Java Web Start应用程序使用Windows密钥库搜索valide证书中的SSL连接?将证书导入每个Java密钥库是没有选择的! 编辑:我想使用Windows密钥库的主要原因是验证已签名应用程序的证书