SWIG - C ++到Python.链接系统库



我正在使用swig为我的c/c ++项目制作python包装器。

设法编译了所有内容,但是在运行python并导入py文件时,我得到了

ImportError: ./_example.so: undefined symbol:sd_bus_get_property_trivial

我正在使用系统库 http://www.linuxfromscratch.org/lfs/view/systemd/chapter06/systemd.html

在我的 h 文件中,我包含该文件 #include <systemd/sd-bus.h>

我认为 systemd lib 的 .so 文件不会自动包含在 swig 中,因为它不在默认的 lib 文件夹中。 它位于/lib/x86_64-linux-gnu/libsystemd.so

如何手动包含此.so文件?这是我的setup.py

#!/usr/bin/env python
"""
setup.py file for SWIG simple_ex
"""
from distutils.core import setup, Extension

example_module = Extension('_example',
                           sources=['example_wrap.cxx', 'example.cpp'],
                           extra_compile_args=["-o /lib/x86_64-linux-gnu/libsystemd.so"]
                           )
setup (name = '_example',
       version = '0.1',
       author      = "SWIG Docs",
       ext_modules = [example_module],
       py_modules = ["_example"],
       )

extra_compiled_args=添加库是一些经验。没用。

这是我.i文件:

/* File: example.i */
%module example
%include std_vector.i
%include std_string.i
%include exception.i

%{
#define SWIG_FILE_WITH_INIT
#include "example.h"
%}
%exception {
    try {
        $action
    } catch(...) {
        SWIG_exception(SWIG_RuntimeError, "Unknown exception");
    }
}
int foo(int a);

foo使用来自systemd/sd-bus的函数

解决这个问题的是使用参数

 runtime_library_dirs=["/lib/x86_64-linux-gnu/"],
 libraries=["systemd"]

在创建Extension时将它们作为参数添加到setup.py文件中

希望这对需要它的人有所帮助。

最新更新