我正在使用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 ++接口编写自己的扩展时,我遇到了类似的问题。我通过在gsl
函数调用的库列表中添加库名Extension
来解决问题。 module = Extension(... libraries = ['gsl', 'cblas'] ...)
。我不知道如何用Boost.Python做同样的事情。
答案 0 :(得分:1)
gsl_multimin_fdfminimizer_conjugate_fr
中没有定义符号cdtm_ext.so
,它在cdtm_ext.so
中引用但未定义,即U
代表的内容。您需要链接到案例gsl
中的库以定义该符号。
有关如何将库与bjam链接的信息,请参阅http://www.boost.org/doc/libs/1_46_1/doc/html/bbv2/tutorial.html#bbv2.tutorial.prebuilt。