2

次のmakefileを使用して適切にコンパイルされるコードがあります

all: sample

sample: sample.o mylib.o
    g++ -Wall -O3 -ffast-math -funroll-loops -ansi -pedantic-errors -o sample -L/usr/lib sample.o mylib.o -lboost_serialization -lboost_iostreams -lz -I /usr/include/boost 

sample.o: sample.cpp
    g++ -O3 -ffast-math -funroll-loops -ansi -pedantic-errors -I /usr/include/boost -c -o sample.o sample.cpp

mylib.o: mylib.cc mylib.h
    g++ -O3 -ffast-math -funroll-loops -ansi -pedantic-errors -I /usr/include/boost -c -o mylib.o mylib.cc

さて、mylib.ccとmylib.hには、共有したい便利なコードがたくさん含まれています。ただし、それは私のターゲットオーディエンスが持っていないか、正しくインストールする方法を知らないかもしれないブーストに依存します。

エンドユーザーがBoostをインストールせずに自分のコードにコンパイルできるmylib.hで静的なmylib.oを配布する方法はありますか?

追加の説明:mylib.hにはBOOSTヘッダーは含まれていませんが、mylib.ccにはブーストヘッダーが含まれています。

4

2 に答える 2

1

に Boost ヘッダー ファイルが含まれている場合mylib.h、それらは開発者のシステムに何らかの形で存在する必要があります。少なくとも、Boost のその部分をコードと共に出荷する必要があります。

ただし、ライブラリの一部のみを公開し、Boost に何も含めたり参照したりしない、より小さなヘッダー ファイルを作成できる場合は、それが可能です。Boost のほとんどはヘッダーのみです (必要な Boost コードは既にライブラリにコンパイルされています)。

于 2012-09-28T18:07:35.693 に答える
1

「ブーストフリー」ヘッダーを作成できる場合は、それを行うことができます。

ヘッダー内にものを後押しするための参照があるとすぐに(再配布する必要があります)、できません。

cc ファイルがヘッダーのみではないブースト クラスを使用している場合は、それらのファイルも (ソースコードまたはオブジェクト ファイル内で) 配布する必要がありますが、ユーザーが別のバージョンのライブラリをブーストし、オブジェクト ファイル内で既に定義されているクラスをインスタンス化しようとします。

考えられる解決策の 1 つは、boost のどの cc ファイルが必要かを調べ、別の名前空間内でそれらをコンパイルすることです-Dboost=my_boost

g++ -Dboost=my_boost <put additional compiler options here> my_boost_file.cc -c my_boost_file.o

また、その定義を使用して独自のオブジェクト ファイルをコンパイルする必要があります。

最後に、必要なすべてのオブジェクト ファイルを含むアーカイブを作成します。

ar rvs my_archive.a mylib.o my_boost_file.o
于 2012-09-28T18:06:56.207 に答える