首页 > 解决方案 > 从具有多个源文件的共享 c++ 库中调用 python 中的函数

问题描述

我在 C++ 中创建了一个共享库,它有多个代码文件,并希望在 Python 中使用这些文件中的函数。如何使用 ctypes 调用这些函数?

我有两个实现简单功能的代码文件(每个文件都有一个头文件)。

foo.cpp         foo.h
palindrome.cpp  palindrome.h

回文.h:

extern int isPalindrome(int A);

回文.cpp:

int isPalindrome(int A) {
    if (A < 0)
        return 0;
    int rev = 0;
    int num = A;

    while (A != 0){
        rev = rev * 10 + (A % 10);
        A = A / 10;
    }
    if (rev == num)
        return 1;

    return 0;
}

我使用以下方法创建了可执行文件:

g++ -c -Wall -Werror -fpic foo.cpp
g++ -c -Wall -Werror -fpic palindrome.cpp

并使用这些可执行文件创建共享库。

g++ -shared -fpic -o libcalc.so foo.o palindrome.o

现在我想使用 libcalc.so 来使用不同 cpp 文件中定义的函数在 python 中创建一个包装器模块。在尝试:

import ctypes

_sum = ctypes.CDLL('./libcalc.so')
_sum.isPalindrome.argtypes = (ctypes.c_int)

它给 AttributeError: ./libcalc.so: undefined symbol: isPalindrome

此错误的原因是什么,我该如何解决?为此目的,除了 ctypes 之外还有其他方法吗?

标签: c++python-3.xshared-librariesc++14ctypes

解决方案


推荐阅读