2

我的代码使用以下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 标头。

4

2 回答 2

1

如果您能够创建“无增强”标题,则可以这样做。

只要您有任何引用来提升标题中的内容(您需要重新分发),您就不能。

如果你的 cc 文件使用了非标头的 boost 类,你也需要分发这些文件——无论是在源代码中,还是在目标文件中——但是,如果用户使用另一个版本的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
于 2012-09-28T18:06:56.207 回答
1

如果mylib.h包含 Boost 头文件,则这些头文件需要以某种形式存在于开发人员的系统中。至少,您必须将 Boost 的那一部分与您的代码一起发布。

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

于 2012-09-28T18:07:35.693 回答