Python扩展没有加载我的共享库

时间:2017-03-17 20:15:47

标签: python-2.7 python-c-extension

我想为我的共享库创建一个python扩展。我能够使用distutils构建和安装它。但是,当我导入模块时,我收到“未定义符号”错误。

说我的共享库'libhello.so'包含一个函数。

#include <stdio.h>
void hello(void) {
  printf("Hello world\n");
}
g++ -fPIC hello.c -shared -o libhello.so
$ file libhello.so
  libhello.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped

这是我的setup.py

#!/usr/bin/env python

from distutils.core import setup, Extension

vendor_lib = '/home/sanjeev/trial1/vendor'

module1 = Extension("hello",
                    sources = ["hellomodule.c"],
                    include_dirs = [vendor_lib],
                    library_dirs = [vendor_lib],
                    runtime_library_dirs = [vendor_lib],
                    libraries = ['hello'])

setup(name = 'foo',
      version = '1.0',
      description = 'trying to link extern lib',
      ext_modules = [module1])

运行设置

$ python setup.py install --home install
$ cd install/lib/python
$ python
Python 2.7.2 (default, Aug  5 2011, 13:36:11)
[GCC 3.4.6 20060404 (Red Hat 3.4.6-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import platform
>>> platform.architecture()
('64bit', 'ELF')

>>> import hello
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: ./hello.so: undefined symbol: hello

1 个答案:

答案 0 :(得分:1)

您的libhello.so是由g++编制的,您没有extern "C" hello您的hello.so函数,因此它的名称已被破坏。

您的gcc扩展程序大概是由<{1}} 编译的,它发出了对未编码符号的引用。

使用hello.c汇编gcc,或将hello.c更改为:

#include <stdio.h>

extern "C" void hello(void);

void hello(void) {
  printf("Hello world\n");
}

如果函数在一个编译单元中定义并从另一个编译单元调用,则应将函数原型放在头文件中,并将其包含在两个编译单元中,以便它们就链接和签名达成一致。

#ifndef hello_h_included
#define hello_h_included

#ifdef __cplusplus
extern "C" {
#endif

void hello(void);

#ifdef __cplusplus
}
#endif

#endif // hello_h_included