Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
链接python扩展模块_Python_C++_Pybind11 - Fatal编程技术网

链接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