【问题标题】:Compiling Cython with C header files error使用 C 头文件编译 Cython 错误
【发布时间】:2015-07-07 18:23:57
【问题描述】:

所以我试图用 Cython 包装一些 C 代码。我阅读了有关执行此操作的应用 Cython 的教程(12),但是这些教程并没有说明如何在使用 Cython 包装代码后如何编译代码,所以我有一个错误说它可以找不到我的 C 代码。

首先,我的 cython 脚本(“calcRMSD.pyx”):

import numpy as np
cimport numpy as np

cdef extern from "rsmd.h":
    double rmsd(int n, double* x, double* y)

#rest of the code ommited

我试图包装的 C 代码(“rmsd.h”):

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

extern "C" {
  // svd from lapack
  void dgesvd_(char*,char*,int*,int*,double*,int*,double*,double*,int*,double*,
           int*,double*,int*,int*);
}

double rmsd(int n, double* x, double* y)
{
   //code omitted
}

Setup.py

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


setup(
    ext_modules = cythonize([Extension("calcRMSD", 
                            sources = ["calcRMSD.pyx"],
                            include_dirs = [np.get_include()],
                            libraries = ["dgesvd"]
                            #extra_compile_args = ["-I."],
                            #extra_link_args = ["-L./usr/lib/liblapack.dylib"]
                            )])

) 

我的错误:

calcRMSD.c:269:10: fatal error: 'rsmd.h' file not found
#include "rsmd.h"

我读到了这个堆栈溢出线程 Using Cython To Link Python To A Shared Library

但遵循它会给我带来不同的错误。如果我尝试将 rmsd.h 放入源中,它会说它无法识别文件类型。

How to link custom C (which itself needs special linking options to compile) with Cython?

这看起来很有希望,但我不确定如何使用它。

请帮忙!

【问题讨论】:

    标签: c++ c linker cython distutils


    【解决方案1】:

    首先它必须找到包含文件rsmd.h。您需要将可以找到此标头的路径添加到include_dirs 参数。丢失文件的错误应该会消失。

    然后,您还需要包含通过编译该 C 代码获得的库。如果那是librsmd.a,您可以将'rsmd' 添加到libraries 参数中。此外,您可能需要一个 library_dirs 参数,其中包含可以找到该库的路径。

    【讨论】:

    • rmsd.h 与我的其余文件位于同一目录中,因此我将 include_dirs 设置为 include_dirs = [np.get_include(), '.'],但仍然出现丢失文件错误
    • 指定完整路径是否有效?安装脚本可能会在不同的目录中编译,例如 build/ 子目录,这可能是个问题。
    • 将其更改为完整路径有效! (我还必须修正一个错字)。我现在在 rmsd.h 的编译中有新的错误,但我会尝试解决这些错误。谢谢!
    • @sth 应该如何处理库文件 librsmd.a?如果我按照您的建议进行操作,则会出现错误,指出 -lrsmd 不是可识别的库。
    • @paulinho:我认为这意味着它找不到 librsmd.a 文件。您可以尝试添加包含.a 文件所在目录的library_dirs = ['/some/dir'] 参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    相关资源
    最近更新 更多