链接python扩展模块
我有两个扩展模块,分别是链接python扩展模块,python,c++,pybind11,Python,C++,Pybind11,我有两个扩展模块,分别是foo和bar Bar 由C++函数和一个简单的包装器组成, #包括 整数加整数(整数a,整数b) { 返回a+b; } 整数条加整数(整数a、整数b) { 返回add_编号(a、b); } PYBIND11_模块(_条,m) { m、 def(“添加编号”和条形图添加编号); } foo具有相同的包装,但没有定义 #包括 整数加整数(整数,整数); 整数加整数(整数a,整数b) { 返回add_编号(a、b); } PYBIND11_模块(_-foo,m) { m、
foo
和bar
<代码> Bar <代码>由C++函数和一个简单的包装器组成,
#包括
整数加整数(整数a,整数b)
{
返回a+b;
}
整数条加整数(整数a、整数b)
{
返回add_编号(a、b);
}
PYBIND11_模块(_条,m)
{
m、 def(“添加编号”和条形图添加编号);
}
foo
具有相同的包装,但没有定义
#包括
整数加整数(整数,整数);
整数加整数(整数a,整数b)
{
返回add_编号(a、b);
}
PYBIND11_模块(_-foo,m)
{
m、 def(“添加编号”、&foo\u添加编号);
}
在使用setuptools构建这些之后
导入操作系统
从设置工具导入设置,扩展
导入pybind11
os.environ['CC']='clang++'
os.environ['CXX']='clang++'
libbar=扩展名('foo.\u bar',
sources=['bar.cpp'],
额外编译参数=['-std=c++14'],
include_dirs=[pybind11.get_include()]
)
libfoo=扩展名('foo.\u foo',
sources=['foo.cpp'],
额外编译参数=['-std=c++14'],
include_dirs=[pybind11.get_include()]
)
安装程序(name='foo',
version='1.0.0',
ext_模块=[libbar,libfoo]
)
我的期望(希望)是,如果在foo.\u foo.\u bar
之后导入foo.\u foo.\u code>,那么add\u numbers
应该从任一包装中正确解析。OSX上似乎确实如此
来自foo导入栏的>>
>>>来自foo import\u foo
>>>_foo.添加_编号(40,2)
42
但是,在ubuntu框中,这会失败,因为未定义符号:_Z11add_numbersii
。就在我认为我可能已经掌握了动态链接的实用知识的时候
我需要在linux(或者更具体地说是基于debian的发行版)上做些什么才能让它正常工作
编辑:两个文件从nm
输出。因此文件是
$ nm _bar.cpython-37m-x86_64-linux-gnu.so | grep "add_numbers"
0000000000004a50 T _Z11add_numbersii
0000000000004a60 T _Z15bar_add_numbersii
及
和fwiw编译器标志是
clang++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2
如果您在两个不同但同时存在的lib中有相同的名称(例如“add_numbers”),那么使用哪一个是正确的?add_numbers
只定义一次。更清楚一点,符号\u Z11add_numbersii
是在扩展模块\u bar.cpython-37m-x86\u 64-linux-gnu.so
中定义的(在本例中)。我希望一旦python解释器加载了该模块,就可以从另一个扩展模块调用该函数。这似乎在OSX上可以工作,但在ubuntu机器上却不行,我有点不知道有什么不同。你能用nm
输出在两个文件中编辑你的问题吗?我怀疑这可能是因为默认的可见性。完成。我也这么认为,但我认为默认的可见性是公共的(尽管我在这里的深度不够)。
clang++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2