Python 扩展没有加载我的共享库
Python extension not loading my shared library
我想为我的共享库创建一个 python 扩展。我能够使用 distutils 构建和安装它。但是,当我导入模块时出现 'undefined symbol' 错误。
假设我的共享库 '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
你的 libhello.so
是由 g++
编译的,而你没有 extern "C"
你的 hello
函数,所以它的名字被破坏了。
您的 hello.so
扩展 大概 由 gcc
编译,它发出了对未损坏符号的引用。
用 gcc
编译 hello.c
,或将 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
我想为我的共享库创建一个 python 扩展。我能够使用 distutils 构建和安装它。但是,当我导入模块时出现 'undefined symbol' 错误。
假设我的共享库 '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
你的 libhello.so
是由 g++
编译的,而你没有 extern "C"
你的 hello
函数,所以它的名字被破坏了。
您的 hello.so
扩展 大概 由 gcc
编译,它发出了对未损坏符号的引用。
用 gcc
编译 hello.c
,或将 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