kotlin-native04 调用c动态库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kotlin-native04 调用c动态库相关的知识,希望对你有一定的参考价值。

参考技术A 这里依然使用上一篇 kotlin-native03 调用c静态库 中的simplelib,只是新建工程的时候将Library type改为shared(或者直接在上一篇的项目中更改CMakeList.txt, 在add_library中将STATIC改为SHARED)

simplelib.h, simplelib.c和上一篇文章的一样

C 语言调用 pybind11 生成的动态链接库

简介

C 语言调用 pybind11 生成的动态链接库?这是什么需求?脱裤子放屁?

因为要在 python 里面可以调用 C 语言的代码,所以要用 pybind11 生成可以被 python 调用的动态链接库。可是,现在竟然有这种奇怪的需求,竟然要调用这个动态链接库!不管你的需求是哪里来的,如果有这个需求,看这篇就对了。网上的讨论几乎没有,毕竟谁会这么干啊。

这篇博客先介绍 pybind11 生成动态链接库,然后再讲如何调用.

pybind11 生成动态链接库

用下面的代码,可以编译生成一个 pybind11 动态链接库。在 python 里面可以调用。

#include <pybind11/pybind11.h>
#include "example.h"

int add(int i, int j) {
    return i + j;
}

PYBIND11_MODULE(example, m) {
    m.doc() = "pybind11 example plugin"; // optional module docstring

    m.def("add", &add, "A function which adds two numbers");
}

调用下面的命令,来生成动态链接库。

g++ -O3 -Wall -shared -std=c++11 -fPIC $(python3 -m pybind11 --includes) example.cpp -o example$(python3-config --extension-suffix)

在当前目录下面,会生成一个 example.cpython-38-x86_64-linux-gnu.so。这时就可以使用 python 调用上面的 add 函数了。

使用 C 语言调用这个动态链接库

main.cpp 代码如下:

#include <stdio.h>
#include "example.h"

int main() {
    printf("Hello pybind11 library, %d \\n", add(1, 2));
    printf("Hello pybind11 library, %d \\n", add(1111, 1222));
}

运行下面的命令编译链接 main.cpp,注意要找到自己本机上 libpython3.8.so 的位置。为什么需要呢?因为 example.cpython-38-x86_64-linux-gnu.so 并没有将 libpython3.8.so 链接进去,需要“动态链接”。此外还需要将头文件加进去,不然会报错,提示找不到头文件。

g++ -I/home/percent1/anaconda3/include/python3.8 -I/home/percent1/anaconda3/lib/python3.8/site-packages/pybind11/include main.cpp example.cpython-38-x86_64-linux-gnu.so ~/anaconda3/lib/libpython3.8.so

总结

为了从 C 语言里面调用 pybind11 生成的动态链接库,你需要做两件事情。一,找到依赖的头文件和库文件。二,编译链接。

以上是关于kotlin-native04 调用c动态库的主要内容,如果未能解决你的问题,请参考以下文章

C 语言动态库封装与设计 ( 动态库调用环境搭建 | 创建应用 | 拷贝动态库相关文件到源码路径 | 导入头文件 | 配置动态库引用 | 调用动态库中的函数 )

python调用C/C++动态库

如何在C语言中调用C++做的动态链接库

cpp调用c的动态库

linux 下的动态库制作 以及在python 中如何调用 c 函数库

C 语言调用 pybind11 生成的动态链接库