ctypes 自己的库加载但无法访问 functions/methods

ctypes own library loads but can't access functions/methods

我正在尝试编写一个 c 例程来加速 python 脚本。

为了路由证明我的方法我先写了一个简短的测试c函数并将它编译成一个库:测试函数的代码是:

void cttest(void);
#include <stdio.h>

void cttest()
{
    printf("This is the shared module|n");
    return;
}

我将这段代码保存到一个文件中 'ct_test.cc'。

然后我将这段代码编译如下:

g++ -shared -fPIC -o /home/paula/libs/libcttest.so ct_test.cc

没有给出错误或警告。

然后我加载了 ipython 并输入了以下内容:

import ctypes as ct

test=ct.CDLL("/home/paula/libs/libcttest.so")

如果我现在尝试访问该功能(通过键入 'test.' 然后按 Tab 键)什么也不会发生。

如果我这样做:

我做错了什么?

哦,以防万一:

OS:xubuntu 14.10 Python:2.7.8 ipython:2.3.0 g++:4.9.1

你有两个问题:

  1. 首先,正如已经指出的那样,选项卡自动完成在第一次使用函数之前不会对 ctypes 起作用。 (让它在大多数平台上运行并非不可能,但我怀疑它会增加加载库的开销)。
  2. 您已经编写了 C 并试图像 C 那样调用它,但是您使用的是 C++ 编译器,所以您遇到了名称重整问题。

第一个问题的解决方案很简单 - 使用全名并且不要依赖自动完成。第二个至少有3个解决方案,我把它们从最好到最坏写在这里:

  1. 使用 C 编译器而不是 C++ 编译器。 (gcc 而不是 g++)。
  2. Use extern "C" 强制 C++ 编译器不破坏函数名:

    extern "C" void cttest(void);
    
    extern "C" 
    {
        void cttest()
        {
            printf("This is the shared module\n");
            return;
        }
    }
    
  3. 在 Python 中使用损坏的 C++ 名称,在本例中为 _Z6cttestv

为了证明这是可行的,我在 Ubuntu 14.04:

上试用了它
gcc -shared -fPIC -o libcttest.so test.c

并在 ipython 中使用它:

ipython
Python 2.7.6 (default, Mar 22 2014, 22:59:38) 
Type "copyright", "credits" or "license" for more information.

IPython 1.2.1 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: import ctypes as ct

In [2]: test=ct.CDLL('./libcttest.so')

In [3]: test.cttest()
This is the shared module
Out[3]: 26