如何从Python代码生成so库并在C中调用它?

mqxuamgl  于 2023-03-01  发布在  Python
关注(0)|答案(1)|浏览(172)

我的目标是从Python代码生成so库,然后用C语言调用它。
add.py

def add(x, y):
    return x+y

使用命令:python -m nuitka --module add.py并获取add.so
使用main. c调用add.so:

#include <stdio.h>
#include <dlfcn.h>

int main()
{
    void* handle = dlopen("./add.so", RTLD_LAZY);

    if (!handle) {
            fputs (dlerror(), stderr);
            exit(1);
    }

    int (*add)(int a, int b);

    add = dlsym(handle, "add");
    if(dlerror()) {
      perror("dlsym error");
      abort();
    }
    int sum = add(7, 8);
    printf("7+8 = %d\n", sum);

    dlclose(handle);
    return 0;
}

然后使用以下代码编译main. c:gcc -o main main.c -ldl结果为:
add.so:未定义的符号:PyExc_系统错误

vngu2lb8

vngu2lb81#

添加下面的代码可以解决“未定义符号:PyExc_系统错误”

#define PY_SSIZE_T_CLEAN
#include <Python.h>
#include <stdio.h>
#include <dlfcn.h>

int main()                                                                                        
{                                               
   Py_Initialize();
   // ...
}

g++编译参数

/usr/bin/python3.10-config  --ldflags --embed
python3.10-config --cflags

g++ -o main main.cc  -ldl -I/usr/include/python3.10 -I/usr/include/python3.10  -Wno-unused-result -Wsign-compare -g      -fstack-protector-strong -Wformat -Werror=format-security  -DNDEBUG -g -fwrapv -O2 -Wall -L/usr/lib/python3.10/config-3.10-x86_64-linux-gnu -L/usr/lib/x86_64-linux-gnu -lpython3.10 -lcrypt -ldl  -lm -lm

但我还是有问题

nm -gD add.cpython-310-x86_64-linux-gnu.so |less

发现
0000000000012430 T PyInit_添加
因此将代码更改为

add = reinterpret_cast<long (*)(long, long)>(dlsym(handle, "PyInit_add"));

仍然失败,总是得到不同的大数值:

g++ -o main main.cc  -ldl -I/usr/include/python3.10 -I/usr/include/python3.10  -Wno-unused-result -Wsign-compare -g      -fstack-protector-strong -Wformat -Werror=format-security  -DNDEBUG -g -fwrapv -O2 -Wall -L/usr/lib/python3.10/config-3.10-x86_64-linux-gnu -L/usr/lib/x86_64-linux-gnu -lpython3.10 -lcrypt -ldl  -lm -lm 
./main
7+8 = 140716692567632
./main
7+8 = 140153746781776
./main
7+8 = 140353451177552

相关问题