Python/C++;:可以导入犰狳(arma::),但不能导入子例程arma::arma\u rng::randn 问题: < P>在使用ARMADILO的C++中创建Python扩展时,我得到的错误是:
A) 在Mac OS Mojave 10.14.4、Python 3.7.5中:Python/C++;:可以导入犰狳(arma::),但不能导入子例程arma::arma\u rng::randn 问题: < P>在使用ARMADILO的C++中创建Python扩展时,我得到的错误是:,python,c++,armadillo,python-c-api,Python,C++,Armadillo,Python C Api,A) 在Mac OS Mojave 10.14.4、Python 3.7.5中: Traceback (most recent call last): File "./py_program.py", line 5, in <module> import cmodule ImportError: dlopen(/Users/angel/.pyenv/versions/3.7.5/lib/python3.7/site-packages/cmodule.cpython-37m-
Traceback (most recent call last):
File "./py_program.py", line 5, in <module>
import cmodule
ImportError: dlopen(/Users/angel/.pyenv/versions/3.7.5/lib/python3.7/site-packages/cmodule.cpython-37m-darwin.so, 2): Symbol not found: __ZTWN4arma23arma_rng_cxx11_instanceE
Referenced from: /Users/angel/.pyenv/versions/3.7.5/lib/python3.7/site-packages/cmodule.cpython-37m-darwin.so
Expected in: flat namespace in /Users/angel/.pyenv/versions/3.7.5/lib/python3.7/site-packages/cmodule.cpython-37m-darwin.so
setup.py
cmodule.cpp
python3 setup.py install
的输出是:
running install
running build
running build_ext
building 'cmodule' extension
creating build
creating build/temp.linux-x86_64-3.8
x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python3.8 -c cmodule.cpp -o build/temp.linux-x86_64-3.8/cmodule.o -std=c++11
creating build/lib.linux-x86_64-3.8
x86_64-linux-gnu-g++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fwrapv -O2 -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 build/temp.linux-x86_64-3.8/cmodule.o -o build/lib.linux-x86_64-3.8/cmodule.cpython-38-x86_64-linux-gnu.so
running install_lib
copying build/lib.linux-x86_64-3.8/cmodule.cpython-38-x86_64-linux-gnu.so -> /usr/local/lib/python3.8/dist-packages
running install_egg_info
Removing /usr/local/lib/python3.8/dist-packages/cmodule-1.0.egg-info
Writing /usr/local/lib/python3.8/dist-packages/cmodule-1.0.egg-info
造成问题的原因是
double rn_y = arma::arma_rng::randn<double>();
double rn_y=arma::arma_rng::randn();
实际上,如果我删除函数f()
,我不会得到任何错误。
注意Armadillo加载成功,因为g()
使用它没有问题。
发生了什么事?在
setup.py
中,libraries=['armadillo']
到Extension()
的参数解决了以下问题:
"""To install the module defined in cmodule.cpp."""
from distutils.core import setup, Extension
setup(name='cmodule', version='1.0', \
ext_modules=[
Extension(
'cmodule', ['cmodule.cpp'],
extra_compile_args=['-std=c++11'],
libraries=['armadillo'], // this solves the problem
language='c++')],
)
奇怪的是,没有它,arma::
就可以正确使用。但不是像arma::arma\rng
这样的“子模块”
这种解决方案是通用的:其他库也会出现同样的问题。事实上,我在GNU科学图书馆(
libraries=['gsl']
)中复制了相同的功能(并使其工作)。在setup.py
中,参数libraries=['armadillo']
到Extension()
修复了这个问题:
"""To install the module defined in cmodule.cpp."""
from distutils.core import setup, Extension
setup(name='cmodule', version='1.0', \
ext_modules=[
Extension(
'cmodule', ['cmodule.cpp'],
extra_compile_args=['-std=c++11'],
libraries=['armadillo'], // this solves the problem
language='c++')],
)
奇怪的是,没有它,arma::
就可以正确使用。但不是像arma::arma\rng
这样的“子模块”
这种解决方案是通用的:其他库也会出现同样的问题。事实上,我用GNU科学库复制了(并使之有效)(<代码>库= [ 'GSL ] )。签名双f(空)是不寻常的-通常一个将写双For()。不完全是对问题的回答,但是在C++中实现Python扩展更容易用pyBix.@。斯蒂芬,更正。谢谢。签名双f(空)是不寻常的-通常一个将写双f-()。不完全是对你的问题的回答,但是在py++中更容易实现C++中的Python扩展。斯蒂芬,更正。非常感谢。
python setup.py install
python py_program.py
running install
running build
running build_ext
building 'cmodule' extension
creating build
creating build/temp.linux-x86_64-3.8
x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python3.8 -c cmodule.cpp -o build/temp.linux-x86_64-3.8/cmodule.o -std=c++11
creating build/lib.linux-x86_64-3.8
x86_64-linux-gnu-g++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fwrapv -O2 -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 build/temp.linux-x86_64-3.8/cmodule.o -o build/lib.linux-x86_64-3.8/cmodule.cpython-38-x86_64-linux-gnu.so
running install_lib
copying build/lib.linux-x86_64-3.8/cmodule.cpython-38-x86_64-linux-gnu.so -> /usr/local/lib/python3.8/dist-packages
running install_egg_info
Removing /usr/local/lib/python3.8/dist-packages/cmodule-1.0.egg-info
Writing /usr/local/lib/python3.8/dist-packages/cmodule-1.0.egg-info
double rn_y = arma::arma_rng::randn<double>();
"""To install the module defined in cmodule.cpp."""
from distutils.core import setup, Extension
setup(name='cmodule', version='1.0', \
ext_modules=[
Extension(
'cmodule', ['cmodule.cpp'],
extra_compile_args=['-std=c++11'],
libraries=['armadillo'], // this solves the problem
language='c++')],
)