2

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 で同じことを行う方法がわかりません。Extensionmodule = Extension(... libraries = ['gsl', 'cblas'] ...)

4

1 に答える 1

2

シンボル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 を参照してください。

于 2012-11-07T15:21:39.670 に答える