我的工作主要是工程分析,但我发现自己在同事中越来越频繁地分发代码。一个巨大的痛苦是并非每个用户都精通编译源代码的复杂性,而且我无法分发可执行文件。
我一直在使用Boost使用C ++,问题是我无法请求每个网络的每个系统管理员安装库。相反,我想分发一个源文件(或尽可能少),以便用户可以g++ source.c -o program
。
所以,问题是:你可以用你的代码打包 Boost库,最终得到一个文件吗?我说的是Boost库,它们只是“标题”或“仅模板”。
作为灵感,请查看SQlite或Lemon Parser Generator的分布情况;作者将这些东西合并为一个简单的编译源文件。
谢谢。
修改:
related question in SO适用于Windows环境。我在Linux工作。
答案 0 :(得分:11)
有一个名为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
答案 1 :(得分:3)
您是否考虑过为SCons等构建系统编写构建脚本?
您可以编写一个python脚本来下载boost,解压缩它编译所需的文件(如果需要,您甚至可以运行bjam)并编译自己的代码。
您的同事需要的唯一依赖是Python和SCons。
答案 2 :(得分:1)
在代码上运行预处理器并保存输出。如果你从一个带有一堆包含的main.cpp开始,你将得到一个文件,其中所有的包含都被吸入。如果你有多个cpp文件,你将必须将它们连接在一起然后运行在连续文件上的预处理器,只要您没有任何重复的全局符号名称,这应该有效。
对于更便携的方法,执行sqlite所做的操作并编写自己的脚本,只需将您创建的文件组合并合并到一起,并且不会将系统包括在内。请参阅sqlite代码中的mksqlite3c.tcl http://www2.sqlite.org/src/finfo?name=tool/mksqlite3c.tcl
答案 3 :(得分:0)
为什么不直接将所有必要的文件签入SVN,并向同事发送存储库的URL?然后,他们可以随时查看代码,在他们想要更新到最新版本时进行'svn up'等。
答案 4 :(得分:0)
如果您使用的是Debian派生的各种Linux,那么这样的问题就不应该出现:让包装系统和政策手册完成工作。只需明确说明libboost-dev或任何包是代码的构建依赖项,需要事先安装,然后/usr/include/boost
应该就在那里,代码期望找到它。如果您使用的是比发行版更新版本的boost,那么可能值得弄清楚如何自己打包它并在现有的打包/依赖框架内工作,而不是重新发明另一个。
我对基于.rpm的发行版不太熟悉,以评论其中的工作方式。但是,知道我可以轻松地设置我需要的构建环境,对我而言,是基于Debian的开发优于Windows的最大优势之一。