[解決済み】「Symbol not found / Expected in: flat namespace」は実際にはどういう意味ですか?
質問
ビルドしたモジュールをインポートすると、このようなboost-python関連のエラーが発生します。
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: dlopen(./myMod.so, 2): Symbol not found: __ZN5boost6python7objects15function_objectERKNS1_11py_functionERKSt4pairIPKNS0_6detail7keywordES9_E
Referenced from: ./myMod.so
Expected in: flat namespace
in ./myMod.so
これは実際にはどういうことなのでしょうか?なぜこのエラーが発生したのでしょうか?
解決方法は?
説明
でコンパイルされたオブジェクトが混在しているために発生した問題です。
libc++
でコンパイルされたオブジェクトと
libstdc++
.
この場合、ライブラリ
myMod.so
(でコンパイルされている)。
libstdc++
) が必要です。
boost-python
でコンパイルしたものを
libstdc++
(
boost-python-libstdc++
を追加しました。) いつ
boost-python
は
boost-python-libstdc++
であれば、問題なく動作します。そうでない場合は、コンピュータ上で
boost-python
でコンパイルしています。
libc++
(または他の c++ ライブラリ) を読み込んで実行する際に問題が発生します。
私たちの場合、この現象は
libc++
の開発者が意図的にすべてのシンボルの名前を変えたのは、彼らのライブラリのコードと別のライブラリのコードが混在するのを防ぐため(そしてあなたを救うため)です。
myMod.so
は、型から引数を取る関数が必要です。で
libc++
この型の名前は
std::__1::pair
. したがって、このシンボルは見つかりませんでした。
同じAPIの2つのバージョンを混ぜることがなぜ悪いのかを理解するために、次のような状況を考えてみましょう。2つのライブラリがある。
Foo
と
Bar
. どちらも
std::string
を使い、それを何かに利用するのですが、両者は異なるc++ライブラリを使っています。しかし、両者は異なるC++ライブラリを使用しています。
std::string
で作成されたものを
Foo
に渡されます。
Bar
,
Bar
は、これがその c++ ライブラリの
std::string
で、悪いことが起こる可能性があります(両者は全く別のオブジェクトです)。
備考 : 場合によっては、同じAPIの異なるバージョンが2つ以上、プログラムの全く別の部分に存在しても問題はないでしょう。しかし、そのAPIのオブジェクトをプログラム間で受け渡しする場合は問題があります。特に、APIオブジェクトを他のオブジェクトのメンバとしてしか渡さない場合、その確認は非常に困難です。また、ライブラリの初期化関数は、2度起こってはいけないことをすることがある。別のバージョンでは、これらのことが再び行われるかもしれません。
それを解決するには?
-
ライブラリはいつでも再コンパイルして、互いに一致させることができます。
-
をリンクすることができます。
boost-python
をスタティック・ライブラリとして使用することができます。そうすれば、ほとんどすべてのコンピュータで動作します。boost-python
がインストールされている)。もっと詳しく見る こちら .
概要
myMod.so
の別バージョンが必要です。
boost-python
特定の c++ ライブラリでコンパイルされたものです。そのため、他のバージョンでは動作しません。
関連
-
PythonによるExcelファイルの一括操作の説明
-
[解決済み】「SyntaxError.Syntax」は何ですか?Missing parentheses in call to 'print'」はPythonでどういう意味ですか?
-
[解決済み] Python で importlib.import_module を使ってモジュールをインポートする方法
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] 億の相対的輸入
-
[解決済み] C++11のT&&(ダブルアンパサンド)の意味とは?
-
[解決済み] Pythonの "at"(@)マークは何をするものですか?
-
[解決済み] Pythonの関数定義における->の意味とは?
-
[解決済み] ポインタの「デリファレンス」とはどういう意味ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ピロウズ画像色処理の具体的な活用方法
-
Python カメの描画コマンドとその例
-
Python jiabaライブラリの使用方法について説明
-
python implement mysql add delete check change サンプルコード
-
Python百行で韓服サークルの画像クロールを実現する
-
Pythonコードの可読性を向上させるツール「pycodestyle」の使い方を詳しく解説します
-
Pythonの@decoratorsについてまとめてみました。
-
[解決済み】お使いのCPUは、このTensorFlowバイナリが使用するようにコンパイルされていない命令をサポートしています。AVX AVX2
-
[解決済み】TypeErrorを取得しました。エントリを持つ子テーブルの後に親テーブルを追加しようとすると、 __init__() missing 1 required positional argument: 'on_delete'
-
[解決済み】Flaskのテンプレートが見つからない【重複あり