将.c文件从Cython转换为独立.exe并编译gcc错误

时间:2015-09-04 11:43:04

标签: python c gcc mingw cython

这是单个问题中的2个单独错误。 我按照Cython网站上关于如何构建cython脚本的文档进行了操作。我创建.pyx文件,cython -a filename.pyx --embed创建.c文件然后

import pyximport; pyximport.install()
import filename

运行我的简单hello world程序。

现在我想在Random Forest上实现cython,并在导入时使用以下模块:

from __future__ import division
from sklearn.ensemble import RandomForestClassifier
import pymysql
import datetime
import csv
from operator import itemgetter
from sklearn.metrics import *
from algoScore import algo_score
import sys

当我尝试 cython -a randomforest.pyx **显示有关** numpy 的一些错误时所以我认为因为numpy使用了c头,我需要通过提供include_path来构建使用distutils setup.py(Following this link)以及以下是我的setup.py:

from distutils.core import setup
from Cython.Build import cythonize
import numpy

setup(
    name = "Test script",
    ext_modules = cythonize('randomforest.pyx', include_path = [numpy.get_include()]),  # accepts a glob pattern
)

当我尝试通过以下命令从命令行构建文件时:

python setup.py build_ext --inplace

我收到以下错误:

running build_ext
building 'randomforest' extension
c:\mingw\bin\gcc.exe -mdll -O -Wall -IC:\Python27\include -IC:\Python27\PC -c randomforest.c -o build\temp.win32-2.7\Release\randomforest.o
writing build\temp.win32-2.7\Release\randomforest.def
c:\mingw\bin\gcc.exe -shared -s build\temp.win32-2.7\Release\randomforest.o build\temp.win32-2.7\Release\randomforest.def -LC:\Python27\libs -LC:\Python27\PCbuild -lpython27 -lmsvcr90 -o "e:\PA - Project\CodeBase\Tests\balanceClasses\balanceClasses\RF\randomforest.pyd"
C:\Python27\libs/libpython27.a(dmmes00976.o):(.idata$7+0x0): undefined reference to `_head_C__build27_cpython_PCBuild_libpython27_a'
C:\Python27\libs/libpython27.a(dmmes00239.o):(.idata$7+0x0): undefined reference to `_head_C__build27_cpython_PCBuild_libpython27_a'
C:\Python27\libs/libpython27.a(dmmes00236.o):(.idata$7+0x0): undefined reference to `_head_C__build27_cpython_PCBuild_libpython27_a'
C:\Python27\libs/libpython27.a(dmmes00245.o):(.idata$7+0x0): undefined reference to `_head_C__build27_cpython_PCBuild_libpython27_a'
C:\Python27\libs/libpython27.a(dmmes00343.o):(.idata$7+0x0): undefined reference to `_head_C__build27_cpython_PCBuild_libpython27_a'
C:\Python27\libs/libpython27.a(dmmes00386.o):(.idata$7+0x0): more undefined references to `_head_C__build27_cpython_PCBuild_libpython27_a' follow
collect2: ld returned 1 exit status
error: command 'c:\\mingw\\bin\\gcc.exe' failed with exit status 1

此外,虽然生成了错误,但我确实生成了.c文件和.def& .o文件也是如此。

我想知道天气这个文件是编译器吗?我可以通过导入从pyximport运行它吗?而且,如果我不能,那么是否有任何特定的方法来使用任何编译器将.c文件编译成独立的.exe文件?

我尝试使用编译器/ c的VC ++命令行,我遇到了following link(编辑1)中描述的问题。

如果有人帮助我,我会很感激,因为我已经长期面对这一点,甚至谷歌搜索似乎没有给出任何答案。

1 个答案:

答案 0 :(得分:1)

当我尝试构建简单的" hello world"时,我收到了类似的错误消息。程序(http://omake.accense.com/static/doc-ja/cython/src/quickstart/build.html)与cython和cygwin GCC。

就我而言,使用VC编译器解决了这个问题。

1)从Microsoft安装Visual C ++ for Python(http://www.microsoft.com/en-us/download/details.aspx?id=44266

2)将已安装的注册表添加到PATH(在我的环境中安装注册表为C:\ Program Files(x86)\ Common Files \ Microsoft \ Visual C ++ for Python)

3)创建配置文件(C:\ Python27 \ Lib \ distutils \ distutils.cfg)。 然后在其中写下以下文字。

[build_ext]
compiler=msvc

4)然后用cython编译。

python setup.py build_ext --inplace