g ++,创建用于分发的静态库

时间:2012-09-28 18:04:47

标签: c++ boost g++ static-libraries

我有使用以下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,我的最终用户只需编译成自己的代码而无需安装Boost?

附加澄清:mylib.h不包含任何BOOST头,但mylib.cc包含boost头。

2 个答案:

答案 0 :(得分:1)

如果你能够创建一个“无提升”标题,你可以这样做。

很快,因为你有任何引用来提升标题内的东西(你需要重新分配),你不能。

如果您的cc文件使用的升级类不是仅限标题,那么您也需要分发这些文件 - 无论是在源代码中还是在目标文件中 - 如果用户使用另一个文件,这会导致奇怪的行为boost库的一个版本,并尝试实例化已在目标文件中定义的类。

一种可能的解决方案是找出需要哪些cc文件的boost,并在不同的命名空间内编译它们,例如:使用-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

答案 1 :(得分:1)

如果mylib.h包含Boost头文件,则需要在开发人员的系统上以某种形式存在这些文件。至少,您必须使用您的代码发送Boost的那部分。

但是,如果您可以创建一个较小的头文件,只显示您的库的各个部分,并且不包含或引用Boost中的任何内容,那么您可以。大多数Boost只是标题(所需的Boost代码已经编译到您的库中)。