4

バックグラウンド:

いくつかの静的ライブラリを共有ライブラリにリンクしたいと思います。その理由は、アプリケーションでテストした特定のlibバージョンを使用するためです。静的バージョンをアプリケーションと共有ライブラリとして出荷したくありません。このサンプルライブラリとアプリケーションは、可能な限り単純化するために作成しました。リンク中に共有ライブラリをアプリケーションにリンクし続けたいと思います。

質問:

以下のエラーメッセージが表示されるのはなぜですか?私は何が間違っているのですか?おそらくこれはLinuxで物事を行う通常の方法ではありませんが、そうすることは可能ですか?このブーストは特定のものですか?

- - 図書館

//example.cpp
#include <boost/thread.hpp>
void doit()
{
    boost::thread t1;
}

#build script
g++ -Wall -fPIC -I/usr/include -c example.cpp -o example.o
g++ -shared /usr/lib/libboost_thread.a /usr/lib/libboost_system.a 
    example.o -o libexample.so
#build OK. 

----サンプルアプリケーション

//main.cpp
#include <iostream>
void doit();
int main()
{
    std::cout << "main\n";
    doit();
    return 0;
};

#build script.
g++ -Wall -c main.cpp -o main.o
g++ libexample.so main.o -o main

#error message.
libexample.so: undefined reference to `boost::thread::thread()'
libexample.so: undefined reference to `boost::thread::~thread()'
collect2: ld returned 1 exit status

すべてのソースコードは同じディレクトリにあります。Boostは/usr/libと/usr/includeにインストールされます。Boostバージョン1.40は、ubuntu10.04マシンにapt-getを使用してインストールされました。

ありがとうございました!

4

1 に答える 1

2

リンカスイッチを使用するのが最も簡単な方法だと思います--whole-archive(このトピックに関するSOの質問は他にもあります。ここで、静的ライブラリをgccのダイナミックライブラリにリンクする方法を参照してください)。

その欠点は、共有ライブラリがBoost静的ライブラリからすべてのシンボルをエクスポートすることです。Boost.soも使用するアプリケーションで使用する場合(ただし、バージョンが異なるか、スイッチが異なる場合)、奇妙な問題が発生する可能性があります。

したがって、バージョンスクリプトを使用して、ライブラリからエクスポートされたものを非表示にする必要があります(共有ライブラリ内でエクスポートされたシンボル名を非表示にする方法、リンカーバージョンスクリプトについてはgoogleも参照)doit()。あなたの場合、そのようなバージョンのスクリプトは次のようになります。

{
global:
    doit*;
local:
    *;
}      

また、リンク先の静的ライブラリがコンパイルされていることを確認する必要があります-fPIC(ビルドフラグを調整しなかった場合は、可能性は低いです)。そうしないと、パフォーマンスが低下しi386、まったくリンクされない可能性があります。にamd64

于 2012-10-28T11:26:35.837 に答える