7

私の仕事は主にエンジニアリング分析ですが、同僚の間でコードを配布することがますます頻繁になっています。大きな問題は、すべてのユーザーがソースコードのコンパイルの複雑さに精通しているわけではなく、実行可能ファイルを配布できないことです。

Boostを使用してC++を使用してきましたが、問題は、すべてのネットワークのすべてのシステム管理者にライブラリのインストールを要求できないことです。代わりに、ユーザーができるように、単一のソースファイル(またはできるだけ少ないファイル)を配布したいと思いますg++ source.c -o program

したがって、問題は、Boostライブラリをコードと一緒にパックして、最終的に1つのファイルにすることができるかということです。「ヘッダーのみ」または「テンプレートのみ」のBoostライブラリについて話しています。

インスピレーションとして、SQliteまたはLemonParserGeneratorのディストリビューションをご覧ください。作者は、コンパイルするのが簡単な単一のソースファイルにそれらを統合します。

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

編集

SOの関連する質問は、Windows環境に関するものです。私はLinuxで働いています。

4

5 に答える 5

11

と呼ばれるブーストに付属のユーティリティがありbcp、ソースをスキャンして、ブースト ソースから使用されているブースト ヘッダー ファイルを抽出できます。この抽出をソース ツリーに行うスクリプトをセットアップしたので、コードと共に必要なソースをパッケージ化できます。また、使用するヘッダーのみではないいくつかのブースト ライブラリのブースト ソース ファイルもコピーし、アプリケーションに直接コンパイルします。

これが一度行われれば、コードを使用する人は誰でも、それがブーストに依存していることを知る必要さえありません。これが私たちが使用するものです。bjam と bcp がまだビルドされていない場合は、それらもビルドされます。

#!/bin/sh
BOOST_SRC=.../boost_1_43_0
DEST_DIR=../src/boost
TOOLSET=
if ( test `uname` = "Darwin") then
    TOOLSET="--toolset=darwin"
fi

# make bcp if necessary
if ( ! test -x $BOOST_SRC/dist/bin/bcp ) then
    if ( test -x $BOOST_SRC/tools/jam/*/bin.*/bjam ) then
        BJAM=$BOOST_SRC/tools/jam/*/bin.*/bjam
    else
        echo "### Building bjam"
        pushd $BOOST_SRC/tools/jam
        ./build_dist.sh
        popd
        if ( test -x $BOOST_SRC/tools/jam/*/bin.*/bjam ) then
            BJAM=$BOOST_SRC/tools/jam/*/bin.*/bjam
        fi

    fi
    echo "BJAM: $BJAM"
    pushd $BOOST_SRC/tools/bcp
    echo "### Building bcp"
    echo "$BJAM $TOOLSET"
    $BJAM $TOOLSET
    if [ $? == "0" ]; then
        exit 1;
    fi
    popd
fi

if ( ! test -x $BOOST_SRC/dist/bin/bcp) then
    echo "### Couldn't find bpc"
    exit 1;
fi

mkdir -p $DEST_DIR

echo "### Copying boost source"
MAKEFILEAM=$DEST_DIR/libs/Makefile.am
rm $MAKEFILEAM
# Signals
# copy source libraries
mkdir -p $DEST_DIR/libs/signals/src
cp $BOOST_SRC/libs/signals/src/* $DEST_DIR/libs/signals/src/.
echo -n "boost_sources += " >> $MAKEFILEAM
for f in `ls $DEST_DIR/libs/signals/src | fgrep .cpp`; do
    echo -n "boost/libs/signals/src/$f " >> $MAKEFILEAM
done
echo >> $MAKEFILEAM

echo "### Extracting boost includes"
$BOOST_SRC/dist/bin/bcp --scan --boost=$BOOST_SRC ../src/*/*.[Ch] ../src/boost/libs/*/src/*.cpp ../src/smart_assert/smart_assert/priv/fwd/*.hpp $DEST_DIR
if [ $? != "0" ]; then
    echo "### bcp failed"
    rm -rf $DEST_DIR
    exit 1;
fi
于 2010-05-20T18:21:36.463 に答える
3

SConsのようなビルド システム用のビルド スクリプトを書くことだけを考えたことはありますか?
ブーストをダウンロードする Python スクリプトを作成し、必要なファイルをアンパックしてコンパイルし (必要に応じて bjam を実行することもできます)、独自のコードをコンパイルすることができます。
同僚が必要とする唯一の依存関係は、Python と SCons です。

于 2010-05-20T18:15:16.347 に答える
2

コードでプリプロセッサを実行し、出力を保存します。多数のインクルードを含む 1 つの main.cpp から始めた場合、すべてのインクルードが吸い込まれた 1 つのファイルになってしまいます。複数の cpp ファイルがある場合は、それらを連結してから実行する必要があります。連結されたファイルのプリプロセッサ。重複するグローバル シンボル名がない限り、これは機能するはずです。

より移植性の高い方法については、sqlite が行うことを実行し、独自のスクリプトを記述して、作成したファイルを結合して連結するだけで + ブーストし、システム インクルードを取得しません。sqlite コードの mksqlite3c.tcl を参照して
ください http://www2.sqlite.org/src/finfo?name=tool/mksqlite3c.tcl

于 2010-05-20T19:07:57.803 に答える
0

必要なすべてのファイルを SVN にチェックインして、同僚にリポジトリの URL を送信してみませんか? その後、いつでもコードをチェックアウトしたり、最新バージョンに更新したいときにいつでも「svn up」を実行したりできます。

于 2010-05-20T18:08:10.347 に答える
0

Debian から派生したさまざまな Linux を使用している場合、このような問題は発生しないはずです。パッケージング システムとポリシー マニュアルに任せてください。libboost-dev またはその他のパッケージはコードのビルド依存関係であり、事前にインストールする必要/usr/include/boostがあり、コードがそれを見つけると予想される場所に配置する必要があることを明確にしてください。ディストリビューション シップよりも新しいバージョンのブーストを使用している場合は、別のものを再発明するのではなく、自分でパッケージ化して既存のパッケージング/依存関係フレームワーク内で作業する方法を考え出す価値があるでしょう。

私は .rpm ベースのディストリビューションに精通しておらず、そこでの動作についてコメントすることはできません。しかし、必要なビルド環境を正確に簡単にセットアップできることを知っていることは、私にとって、Windows に対する Debian ベースの開発の最大の利点の 1 つです。

于 2010-05-20T20:59:34.090 に答える