使用ctypes时未定义符号

问题描述 投票:0回答:2

我正在使用ctypes调用C代码:

mysum.cpp

//global variables and required functions are defined
int mysum(int ECG_sample) 
{
   int HR;
   ecg_wave_sample = ECG_sample;
   Filter_CurrentECG_sample(&ecg_wave_sample, &ecg_filterout);  
   Calculate_HeartRate(ecg_filterout,&global_HeartRate); // calculate HeartRate
   HR = global_HeartRate;
   return HR;
}

[g++ -shared -o mysum.so -fPIC mysum.cpp用于创建.so文件]

Python包装器:

libname = '/home/yasaswini/hp2-notebooks/notebooks/Algorithm_testing_on_database/mysum_example  /mysum.so'
libdir = './'
lib=ctl.load_library(libname, libdir)
py_add_one = lib.mysum
py_add_one.restype = ctypes.c_int
py_add_one.argtypes = [ctypes.c_int]
sample = -145
results = py_add_one(sample)

我收到此错误

 AttributeError Traceback (most recent call last) <ipython-input-75-858227ec99e5> in <module>
  6 # 1. open the shared library
  7 #mylib = ctypes.CDLL(libfile)
  ----> 8 py_add_one = lib.mysum
  9 
  10 # 2. tell Python the argument and result types of function mysum

  ~/anaconda3/lib/python3.7/ctypes/__init__.py in __getattr__(self, name)
   375         if name.startswith('__') and name.endswith('__'):
   376             raise AttributeError(name)
   --> 377         func = self.__getitem__(name)
   378         setattr(self, name, func)
   379         return func

   ~/anaconda3/lib/python3.7/ctypes/__init__.py in __getitem__(self, name_or_ordinal)
  380 
  381     def __getitem__(self, name_or_ordinal):
  --> 382         func = self._FuncPtr((name_or_ordinal, self))
  383         if not isinstance(name_or_ordinal, int):
  384             func.__name__ = name_or_ordinal

  AttributeError: /home/yasaswini/hp2-notebooks/notebooks/Algorithm_testing_on_database /mysum_example/mysum.so: undefined symbol: mysum

有人可以指出我到底在做什么错吗?

python ctypes
2个回答
1
投票

这可能与C ++名称修改有关。

由于正在使用C ++(extern),因此需要在mysum.cpp中的函数定义中添加g++。您的情况:

extern "C" int mysum(int ECG_sample) 
{
   ...
}

有关名称修改的更多信息

另请参见

https://stackoverflow.com/a/11237254/7919597

https://stackoverflow.com/a/34380673/7919597


0
投票

我使用了给定的逻辑here

。c文件:

int simple_function(int ECG_samples) 
{
    ecg_wave_sample = ECG_samples;
    ECG_ProcessCurrSample(&ecg_wave_sample, &ecg_filterout); 
    QRS_Algorithm_Interface(ecg_filterout);
    printf("HR:%d\n",ecg_wave_sample);
    return global_HeartRate;  
}

Python脚本:

import numpy
def call_function_with_no_args(libc): 
ECG_samples = [3,4,6,6,9,11,13,17,18,21,23,24,28,30,33,35,36,36]
while(1):

    for i in range (len(ECG_samples)):
        value = print(libc.simple_function(ECG_samples[i]))
    print()
return value

if __name__ == "__main__":
# load the shared library into c types.
    libname = os.path.abspath(os.path.join(os.path.dirname(__file__),
                                       "libclib1.so"))
    LIBC = ctypes.CDLL(libname)


call_function_with_no_args(LIBC)

我认为这是使用ctypes的最佳方法。它简单易懂。 Makefile生成.so文件。感谢您的帮助。 :-)

© www.soinside.com 2019 - 2024. All rights reserved.