7

我的工作主要包括工程分析,但我发现自己越来越频繁地在同事之间分发代码。一个很大的痛苦是不是每个用户都精通编译源代码的复杂性,而且我无法分发可执行文件。

我一直在使用 Boost 使用 C++,问题是我不能要求每个网络的每个系统管理员都安装这些库。相反,我想分发单个源文件(或尽可能少),以便用户可以g++ source.c -o program.

所以,问题是:你能用你的代码打包Boost 库,并最终得到一个文件吗?我说的是“仅标题”或“仅模板”的 Boost 库。

作为灵感,请查看SQliteLemon Parser Generator的分布;作者将这些东西合并到一个易于编译的源文件中。

谢谢你。

编辑

SO中的一个相关问题是针对Windows环境。我在 Linux 中工作。

4

5 回答 5

11

boost 附带了一个名为 的实用程序bcp,它可以扫描您的源并提取从 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
于 2010-05-20T18:21:36.463 回答
3

您是否考虑过为SCons 之类的构建系统编写构建脚本?
你可以编写一个 python 脚本来下载 boost,解压它并编译所需的文件(如果需要,你甚至可以运行 bjam)并编译你自己的代码。
您的同事需要的唯一依赖项是 Python 和 SCons。

于 2010-05-20T18:15:16.347 回答
2

在您的代码上运行预处理器并保存输出。如果您从一个包含一堆包含的 main.cpp 开始,您最终会得到一个包含所有包含的文件。如果您有多个 cpp 文件,则必须将它们连接在一起然后运行连接文件上的预处理器,只要您没有任何重复的全局符号名称,这应该可以工作。

对于更便携的方法,做 sqlite 所做的并编写自己的脚本,将您创建的文件组合并连接在一起+ Boost,而不是让系统包含。参见 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应该就在您的代码期望找到它的地方。如果您使用的是比发行版更新的 boost 版本,那么可能值得弄清楚如何自己打包它并在现有的打包/依赖框架中工作,而不是重新发明另一个。

我对基于 .rpm 的发行版不够熟悉,无法评论那里的工作方式。但是知道我可以轻松地准确设置我需要的构建环境,对我来说,这是基于 Debian 的开发相对于 Windows 的最大优势之一。

于 2010-05-20T20:59:34.090 回答