3

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.

いくつかの方法で回避できます。

  1. すべてのライブラリを次のようにリンクします。-Xlinker --whole-archive
  2. 共有オブジェクトでライブラリのダミー使用を作成する

考えられるすべてのライブラリを調べて --whole-archive で追加するのは本当に面倒なので、誰かが別の解決策を考えられるかどうか疑問に思っていました。

4

2 に答える 2

2

OK、誰も応答していないので、最も簡単な(そして私が知っている唯一の解決策)は、あなたが持っているすべての静的ライブラリを含めることです:

-Xlinker --whole-archive

もちろん、ライブラリを動的にリンクすることもできます。これには、Python アプリケーションを実行するときに LD_LIBRARY_PATH を設定する必要があります (ただし、これは多くのライブラリではオプションではありませんでした)。

したがって、この意味で、明示的な動的リンクはより洗練されたソリューションと見なされる可能性があります。

さらに、ライブラリが他のライブラリを使用している場合:

python_mapping.so -> utility1.a でリンクされた静的 -> utility2.a でリンクされた静的

utility1.a にリンクするのを忘れた場合、Python アプリケーションを実行すると、シンボルが見つからないことがわかりますが、utility2.a については文句を言わず、その部分に到達すると奇妙な動作をします。図書館。だから...注意して、すべてに明示的にリンクしていることを確認してください。

于 2012-09-28T22:33:22.073 に答える