使用C头文件编译Cython错误

时间:2015-07-07 18:23:57

标签: c++ c linker cython distutils

所以我试图用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?

这看起来有点前途,但我不知道如何使用它。

请帮忙!

1 个答案:

答案 0 :(得分:4)

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

然后,您还需要包含从编译C代码中获得的库。如果您要librsmd.a 'rsmd',请将libraries添加到library_dirs参数中。此外,您可能需要一个// [[Rcpp::depends(BH)]] #include <Rcpp.h> #include <boost/multiprecision/cpp_dec_float.hpp> using boost::multiprecision::cpp_dec_float_100; // [[Rcpp::export]] SEXP getBig(int a, int b) { cpp_dec_float_100 seventh = cpp_dec_float_100(1) / 7; return Rcpp::wrap(seventh); } 参数,其中包含可以找到该库的路径。