【问题标题】:Boost.Python | Symbol in .so file but I get ImportError: undefined symbolBoost.Python | .so 文件中的符号,但我得到 ImportError: undefined symbol
【发布时间】:2012-11-06 07:55:49
【问题描述】:

我正在使用 Boost.Python 在我的 Python 应用程序中嵌入 C++ 代码。该模块构建良好,并带有一些警告。当我在 Python 中导入模块时,出现此错误:

ImportError: .../cdtm_ext.so: undefined symbol: gsl_multimin_fdfminimizer_conjugate_fr

该符号定义在外部库(Gnu Scientific Library)头文件中,该符号存在于.so文件中:

$ nm cdtm_ext.so | grep gsl_multimin_fdfminimizer_conjugate_fr
   U gsl_multimin_fdfminimizer_conjugate_fr

这是我的Jamroot 文件:

import python ;

if ! [ python.configured ]
{
    ECHO "notice: no Python configured in user-config.jam" ;
    ECHO "notice: will use default configuration" ;
    using python ;
}

use-project boost
  : ../../../.. ;

project
  : requirements 
    <library>/boost/python//boost_python
    <include>/usr/local/include/gsl
    ;

python-extension cdtm_ext : cdtm.boost.cpp cdtm/cdtm-model.cpp cdtm/corpus.cpp    cdtm/main.cpp cdtm/opt.cpp cdtm/utils.cpp : <library-path>/usr/local/include/gsl ;

install convenient_copy 
  : cdtm_ext 
  : <install-dependencies>on <install-type>SHARED_LIB <install-type>PYTHON_EXTENSION
    <location>. 
  ;

当我使用低级 C++ 接口编写自己的扩展时,我遇到了类似的问题。我通过在Extension 函数调用的库列表中添加库名称gsl 解决了该问题。 module = Extension(... libraries = ['gsl', 'cblas'] ...)。我不知道如何用 Boost.Python 做同样的事情。

【问题讨论】:

    标签: python boost boost-python bjam python-import


    【解决方案1】:

    符号gsl_multimin_fdfminimizer_conjugate_fr 没有在cdtm_ext.so 中定义,它在cdtm_ext.so 中被引用但未定义,这就是U 的含义。您需要链接到库 gsl 以定义该符号。

    请参阅http://www.boost.org/doc/libs/1_46_1/doc/html/bbv2/tutorial.html#bbv2.tutorial.prebuilt 了解如何将库与 bjam 链接。

    【讨论】:

      猜你喜欢
      • 2021-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-06
      • 2014-04-12
      • 1970-01-01
      • 2020-03-10
      相关资源
      最近更新 更多