簡體   English   中英

簡單高效地分發C ++ / Boost源代碼(合並)

[英]Simple and efficient distribution of C++/Boost source code (amalgamation)

我的工作主要是工程分析,但我發現自己在同事中越來越頻繁地分發代碼。 一個巨大的痛苦是並非每個用戶都精通編譯源代碼的復雜性,而且我無法分發可執行文件。

我一直在使用Boost使用C ++,問題是我無法請求每個網絡的每個sysadmin安裝庫。 相反,我想分發一個源文件(或盡可能少),以便用戶可以g++ source.c -o program

所以,問題是:你能用你的代碼打包 Boost庫,最終得到一個文件嗎? 我在談論Boost庫,它們只是“標題”或“僅模板”。

作為靈感,請查看SQliteLemon Parser Generator的分布情況; 作者將這些東西合並為一個單獨的源文件,這對於編譯來說是微不足道的。

謝謝。

編輯

SO中相關問題適用於Windows環境。 我在Linux工作。

有一個名為bcp boost附帶的實用程序可以掃描你的源並提取從boost源使用的任何boost頭文件。 我已經設置了一個腳本,將這個提取到我們的源代碼樹中,這樣我們就可以將我們需要的源和代碼打包在一起。 它還會復制我們使用的幾個只有頭文件的boost庫的boost源文件,然后直接編譯到我們的應用程序中。

這只做了一次,然后任何使用代碼的人都不需要知道它取決於boost。 這是我們使用的。 它還將構建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

您是否考慮過為SCons等構建系統編寫構建腳本?
您可以編寫一個python腳本來下載boost,解壓縮它編譯所需的文件(如果需要你甚至可以運行bjam)並編譯自己的代碼。
您的同事需要的唯一依賴是Python和SCons。

在代碼上運行預處理器並保存輸出。 如果你從一個帶有一堆包含的main.cpp開始,你將得到一個文件,其中所有的包含都被吸入。如果你有多個cpp文件,你將必須將它們連接在一起然后運行在連續文件上的預處理器,只要您沒有任何重復的全局符號名稱,這應該可以工作。

對於更方便的方法,執行sqlite所做的操作並編寫自己的腳本,只需將您創建的文件和boost組合在一起並將其連接起來,而不是讓系統包含。 請參閱sqlite代碼中的mksqlite3c.tcl
http://www2.sqlite.org/src/finfo?name=tool/mksqlite3c.tcl

為什么不直接將所有必要的文件簽入SVN,並向同事發送存儲庫的URL? 然后,他們可以隨時查看代碼,在他們想要更新到最新版本時進行'svn up'等。

如果您使用的是Debian派生的各種Linux,那么這樣的問題就不應該出現:讓包裝系統和策略手冊完成工作。 只是說清楚libboost-dev或任何包是你的代碼的構建依賴,需要事先安裝,然后/usr/include/boost應該在你的代碼期望找到它的地方。 如果你使用的是比發行版更新版本的boost,那么可能值得弄清楚如何自己打包並在現有的打包/依賴框架內工作,而不是重新發明另一個。

我對基於.rpm的發行版不太熟悉,無法對那里的工作進行評論。 但是,知道我可以輕松地設置我需要的構建環境,對我來說,是基於Debian的開發優於Windows的最大優勢之一。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM