Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.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/C++;:可以导入犰狳(arma::),但不能导入子例程arma::arma\u rng::randn 问题: < P>在使用ARMADILO的C++中创建Python扩展时,我得到的错误是:_Python_C++_Armadillo_Python C Api - Fatal编程技术网

Python/C++;:可以导入犰狳(arma::),但不能导入子例程arma::arma\u rng::randn 问题: < P>在使用ARMADILO的C++中创建Python扩展时,我得到的错误是:

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-

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-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
  • 在Ubuntu中,
    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++')],
          )