1

私の質問はこれに関連しています:静的および共有C++ライブラリの両方を作成する

2つの異なるシステムの〜/ localにインストールするために、ライブラリをコンパイルしています。これを行うたびに、リンカーの問題が発生し、理解するのに何時間もかかるようです。私が見ている特定のライブラリはprimesieveです。そのライブラリでは、静的ライブラリのみをビルドするのがデフォルトです。残念ながら、サンプルコードcount_primes.cppは、何らかの理由で、私のシステムの1つにある静的バージョンのライブラリとリンクしませんでした。最終的に私は共有バージョンを構築する方法を理解し、コードは醜いハックを必要とせずにうまくコンパイルされるようになりました。

上記のことを考えると、複数のシステムで作業していて、コードをコンパイルする可能性を最大限に高めたい場合は、静的バージョンと共有バージョンの両方をコンパイルすることをお勧めします。これは本当ですか?両方のバージョンをビルドしない理由はありますか?これは少し主観的な質問だと思いますが、ここの多くの人がおそらく遭遇したと思う深刻なプログラミングの問題です。


PS。

これは、primesieveの共有バージョンと静的バージョンの両方をコンパイルして〜/localにインストールするために使用することになったものです。

make
make lib
make install PREFIX=~/local
make clean
make lib SHARED=yes
make install PREFIX=~/local

これmake clean原因です。次に、これを自分の.bash_profile:に追加しました。

export LIBRARY_PATH=$LIBRARY_PATH:~/local/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/local/lib
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:~/local/include

または、環境変数を変更せずに、次のcount_primes.cppようにサンプルプログラムをコンパイルできました。

g++ -I ~/local/include/ -L ~/local/lib/ -lprimesieve count_primes.cpp
4

2 に答える 2

2

静的ライブラリを使用するには、通常のオブジェクトファイルであるかのようにコンパイルに含めることができます。

g++ -o foo foo.cpp /path/to/mylib.a

もちろん、これは静的リンクも意味します。

まだ動的ライブラリと静的にリンクできるので、静的ライブラリはあまり使用されません。

于 2013-03-26T15:43:19.563 に答える
1

両方を構築しない理由はありません。どちらのライブラリも何も「実行」しません。共有ライブラリは、ダイナミックリンカが実行可能なパスにある場合にのみロードされます(LDライブラリパスに追加した場合と同様)。静的なものは、明示的にリンクしない限り使用されませんが、コンパイル(リンク)時にのみ実行されます。

于 2013-03-26T15:30:11.987 に答える