Boost.Python を使用して C++ コードを Python アプリに埋め込みます。モジュールは、いくつかの警告で正常にビルドされます。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
のライブラリリストにライブラリ名を追加することで、問題を修正しました。. Boost.Python で同じことを行う方法がわかりません。Extension
module = Extension(... libraries = ['gsl', 'cblas'] ...)