【问题标题】:Problems with compiling C code in Python在 Python 中编译 C 代码的问题
【发布时间】:2015-10-11 08:26:55
【问题描述】:

我在 Windows 7 64 位中使用 Anaconda for Python 2.7.10。我还使用 Visual Studio 2010。我安装了 Microsoft Visual Studio for Python。

当我尝试在 python 中编译 C 代码时(在 cmd 中):

C:\Anaconda\sms-tools-master\software\transformations_interface>python compileModule.py build_ext --inplace

我收到很多警告和一些错误,它的最后部分如下:

C:\Program Files (x86)\Microsoft Visual Studio

10.0\VC\BIN\amd64\link.exe /DLL / nologo /INCREMENTAL:NO /LIBPATH:C:\Anaconda\libs /LIBPATH:C:\Anaconda\PCbuild\am d64 m.lib

/EXPORT:initutilFunctions_C build\temp.win-amd64-2.7\Release\utilFunct
ions.obj build\temp.win-amd64-2.7\Release\cutilFunctions.obj

/OUT:C:\Anaconda\sm
s-tools-master\software\models\utilFunctions_C\utilFunctions_C.pyd

/IMPLIB:build \temp.win-amd64-2.7\Release\utilFunctions_C.lib

/MANIFESTFILE:build\temp.win-amd
64-2.7\Release\utilFunctions_C.pyd.manifest LINK : fatal error

LNK1181: cannot open input file 'm.lib' error: command 'C:\\Program
Files (x86)\\Microsoft Visual Studio 10.0\\VC\\BIN\\ amd64\\link.exe'

failed with exit status 1181

请让我看看如何解决这个问题。

【问题讨论】:

    标签: python c visual-studio-2010 compilation


    【解决方案1】:

    如果我只评论

    libraries=['m']
    

    并使用

    ext_modules = [Extension("utilFunctions_C",sourcefiles, include_dirs=py_inc + np_inc)]    
    

    然后我收到很多警告(希望不是错误),其最后部分是:

    C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\BIN\amd64\link.exe /DLL / nologo /INCREMENTAL:NO /LIBPATH:C:\Anaconda\libs /LIBPATH:C:\Anaconda\PCbuild\am d64 /EXPORT:initutilFunctions_C build\temp.win-amd64-2.7\Release\utilFunctions.o bj build\temp.win-amd64-2.7\Release\cutilFunctions.obj /OUT:C:\Anaconda\短信工具 s-master\software\models\utilFunctions_C\utilFunctions_C.pyd /IMPLIB:构建\临时。 win-amd64-2.7\Release\utilFunctions_C.lib /MANIFESTFILE:build\temp.win-amd64-2.7 \Release\utilFunctions_C.pyd.manifest cutilFunctions.obj:警告 LNK4197:导出 'initutilFunctions_C' 指定多次;使用 第一个规范创建库 build\temp.win-amd64-2.7\Release\utilFunctions_C.lib 和对象 build\temp.win-amd64-2.7\Release\utilFunctions_C.exp

    我认为问题现在已经解决了。谢谢LP们!!

    【讨论】:

      【解决方案2】:

      setup.py 中注释libraries=['m'] 的行,然后再次运行。

      链接到 m 的需要可能是 GCC 的事情来链接 Math 库,它在 Windows 环境中由 MSVCR 管理。

      【讨论】:

        【解决方案3】:

        从 ext_modules 中删除 .. libraries=['m'] .. 也帮助我在 Windows 2010 上编译。没有错误或警告。这就是它最终的样子,

        ext_modules = [Extension("utilFunctions_C",sourcefiles , include_dirs=py_inc + np_inc)]
        

        非常感谢

        编辑.....

        这是compileModule.py 的完整代码 详情请参考cmets。

        from distutils.core import setup, Extension
        from distutils.sysconfig import *
        from distutils.util import *
        from Cython.Distutils import build_ext
        import numpy
        import os
        import os.path
        
        #defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
        
        try:
           from distutils.command.build_py import build_py_2to3 \
           as build_py
        except ImportError:
           from distutils.command.build_py import build_py
        
        try:
           from Cython.Distutils import build_ext
        except ImportError:
           use_cython = False
        else:
           use_cython = True
        
        
        py_inc = [get_python_inc()]
        
        np_lib = os.path.dirname(numpy.__file__)
        np_inc = [os.path.join(np_lib, 'core/include')]
        ext_inc = os
        
        sourcefiles = ["utilFunctions.c", "cutilFunctions.pyx"]
        
        setup(
            cmdclass = {'build_ext': build_ext},
            #ext_modules = [Extension("utilFunctions_C",sourcefiles, libraries=['m'], include_dirs=py_inc + np_inc)]
            ext_modules = [Extension("utilFunctions_C",sourcefiles , include_dirs=py_inc + np_inc)]
        
          )
        

        【讨论】:

        • 您能否将其格式设置得更好一些以便清楚起见并提供一些相关文档的链接?
        • 是的,当然。我有 windows 2010 笔记本电脑,我正在研究使用 python 的音频处理算法,因为它更容易原型和测试,并且有大量支持可用。为此,我从这里下载了 sms-tools:https://github.com/MTG/sms-tools1 并正在运行 python compileModule.py build_ext --inplace 如果您参考 wiki @( github.com/MTG/sms-tools/wiki/sms-tools-in-Windows) ,它明确指出为了在 Windows 上编译,我们需要删除 libraries=['m'],来自compileModule.py,因为此选项适用于 gcc,所以我们不需要在 windows 上。
        猜你喜欢
        • 2011-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多