2015-01-08 20 views
13

私が働いているチームは、Pythonで使うための共有ライブラリを生成します。このライブラリは完全にC++で、Boostを使ってPythonを公開しています。 Boostライブラリがインストールされていることを保証することはできないので、Boostから必要な機能を共有オブジェクトファイルに静的に引き込みます。 1.47:コンパイルの最終段階は、我々は伝統的にブーストの私たち自身のビルドを使用していた多くのBoostに-fPICを強制的にコンパイルする方法

g++ -o <output> <objects> -Wl,-Bstatic -lboost_python -lboost_regex ... -Wl,-Bdynamic -shared <other_opts> 

に見覚えがあるでしょう。このバージョンはかなり古くなっており、更新したいと考えています。私はCentOSの上のyum 7システムを使用して、必要なオブジェクトをインストールするときしかし、奇妙なことに、私は、GCCから次のエラーを取得する:

relocation R_X86_64_32 against '.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC 

まあ、私は単にCentOSの7は、ブーストをインストールします(最新のブーストをダウンロードしようと思いました1.53)自分のビルドをしてください。結局のところ、これはいつも私たちのために働いてきました。私はinstructions hereに従うが、私は同じエラーが発生した。ビルドするスタティックライブラリでも-fPICを強制的に使用するにはどうすればよいですか?

+0

あなたは、GCC(あるいは実行時に実行可能)が特注Boostライブラリを発見されていることを確認していますか?実行時にgccや 'LD_LIBRARY_PATH'の' -L'を使ってライブラリ検索ディレクトリを変更できます。 – NicholasM

+2

'cxxflags =" - fPIC "'を使用して、コンパイラフラグを使用するようにboostビルドを指示できます。 'linkflags'という名前の同様の変数があります。 http://www.boost.org/build/doc/html/bbv2/overview/invocation.htmlのboost build documentationを参照してください。 – NicholasM

+0

@NicholasMはい、私のライブラリはldによって使用されていると確信しています。私はこれを強制するためにldに-Lオプションを使用しています。そのリンクをありがとうございました。私が使っていたリンクはこれについて言及していませんでした。 –

答えて

13

私は、共有ライブラリ(.soファイル)をコンパイルするときにブーストが自動的に-fPICを使うと信じていますが、静的ライブラリ(.aファイル)をコンパイルするときは以下のコマンドで-fPICを使います。

これはブースト1.46.1に私の仕事:

sudo ./bjam cxxflags=-fPIC cflags=-fPIC -a ... install 

...あなたがthreading=multiまたは--layout=taggedのような追加のフラグを追加し、(:--with-regexたとえば)を構築するためのプロジェクトのリストをオプションところです。

注:私はcflagsが必要であるとは確信していませんが、怪我をすることはありません。

参考リンク:

+0

ブースト1.61.0: 'cflags'は冗長であるようです。また 'sudo'は、ローカル(つまり、システム全体ではない)インストールでは冗長でなければなりません。 – smbear

+0

@smbear 'cflags'はおそらく冗長です。私はそれが必要かどうかは確かではありませんでしたが、傷ついていないようです。 –

+1

cxxflagsはC++で、cflagsはCとC++です。だから、cxxflagsは厳密に黙示されているように技術的に冗長なものですが、BoostはC++なので、まったく同じです。 –

関連する問題