我有使用以下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头。
答案 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代码已经编译到您的库中)。