2017-01-09 3 views
3

私が使用して動的ライブラリ(dynamicLib.so)に静的ライブラリ(staticLib.a)++グラムとリンクしようとしています:グラム++

g++ *.o -Wl,--whole-archive staticLib.a -Wl,--no-whole-archive -shared -o dynamicLib.so 

そして、私はhereと同じエラーを得た:

/usr/bin/ld: staticLib.a(object.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC staticLib.a(object.o): error adding symbols: Bad value collect2: error: ld returned 1 exit status

は、私はいくつかのトピックを読んで、私は私が探しています答えを見つけることができませんでした。 staticLib.aは位置非依存コード(PIC)としてコンパイルされませんでした。 link aboveによれば、それは必須と思われる。しかし、staticLib.aは私が制御できない別のプロジェクトのライブラリです。

私の最初の考えは、オブジェクト*.o using ar -x(in this second linkのように)を抽出することでした。しかし、問題はオブジェクトが-fPICでコンパイルされていないのと同じままです。

自分のMakefileを作成してstaticLib.aを-fPICで再コンパイルすることができました(私は既存のプロジェクトを台無しにしたくありません)。しかし、私はそれが良い方法であることを確認していません...

私の質問は以下です:-fPICなしでコンパイルされた)静的ライブラリを動的なものにリンクする方法はありますか?

関連トピック:

答えて

2

So my question is the following: Is there any possible way to link a static library (compiled without -fPIC) into a dynamic one ?

位置独立コードを提供するものとして何ら実質的にすでにコンパイルされたコードを変更することはできませんコンパイルを必要としません。理論的には、バイナリからソースコードをリバースエンジニアリングして再コンパイルすることはできますが、それは完全に無効な解決策になります。したがって、渡された-fPICを使って元のプロジェクトを(再)コンパイルする必要があります。

+0

私は恐れていました。返信いただきありがとうございます。 – Nicolas