boost::python を使用してアプリケーションのラッパーを作成しました。
これはこれまでのところ、(静的ライブラリの数/ソースコード) -> python_mapping.so で機能しています。
このように、私の共有オブジェクトは、boost 自体 (特に boost_thread) を含む多くの静的ライブラリで構成されています。すべてを静的にリンクしているので、これにはすべてのアプリケーション情報が含まれると思います。
これは問題なくコンパイルされます。
ldd python_mapping.so
librt.so.1 => /lib64/librt.so.1 (0x00002b7cbad37000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00002b7cbaf40000)
libm.so.6 => /lib64/libm.so.6 (0x00002b7cbb240000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00002b7cbb4c4000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b7cbb6d2000)
libc.so.6 => /lib64/libc.so.6 (0x00002b7cbb8ed000)
/lib64/ld-linux-x86-64.so.2 (0x000000327ee00000)
ただし、サンプルの python アプリケーションを実行すると、この実行時リンク エラーが発生します: undefined symbol: _ZTIN5boost6detail16thread_data_baseE
静的ライブラリにうまくリンクされているブースト ライブラリは実際には存在しないようですか?
私はこれについていくつかの進歩を遂げました。どうやら私の共有オブジェクトには、コンパイラが使用されているとは思わなかった多くのシンボルが含まれていないようです (これは、Python オブジェクトをインスタンス化することによって作成されるため、これまでに作成された私の C++ オブジェクトを見たことがないためです)。
のようなもの:
//This is a class only created in python
#include "CPlusPlusClass.h"
PythonClass
{
public:
PythonClass() { }
private:
CPlusPlusClass _cplusplus;
};
//PythonMappings for PythonClass
#python file
import python_mapping
pythonClass = python_mapping.PythonClass() #This fails saying it can't find the symbol for CPlusPlusClass
コンパイラは、CPlusCPlus クラスが実際に使用されていることをまったく認識しないため、CPlusCPlus クラスを最適化して除外します。これはまったく不快です。PythonClass 自体を保持しているようです (おそらく Python Boost Mapping Macro.
いくつかの方法で回避できます。
- すべてのライブラリを次のようにリンクします。
-Xlinker --whole-archive
- 共有オブジェクトでライブラリのダミー使用を作成する
考えられるすべてのライブラリを調べて --whole-archive で追加するのは本当に面倒なので、誰かが別の解決策を考えられるかどうか疑問に思っていました。