2012-09-28 17 views
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.o,它是一个静态的mylib.h,我的最终用户不需要安装Boost就可以编译成自己的代码?

附加澄清:mylib.h不包含任何BOOST标题,但mylib.cc包含增强标题。

回答

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 
+0

不是,它是非常烦人的困难,无用和非常规。除了可能与tge用户能够使用安装在他的系统上的增压副本或他自己的副本相冲突之外。 –

+0

所以,我能够彻底根除我的标题中的Boost。但与标题关联的.cc文件使用Boost。那么我有办法做到这一点吗? – user788171

+0

只要你使用boost的头文件部分(大多数boost是头文件),是的,你应该能够分发库和头文件。 –

1

如果mylib.h包括升压头文件,这些将需要以某种形式存在开发者的系统上。至少,你必须用你的代码运送Boost的那部分。但是,如果你可以创建一个更小的头文件来暴露你的库的各个部分,并且在Boost中不包含或者引用任何东西,那么你可以。大多数Boost是仅标题(所需的Boost代码已经编译到您的库中)。

+0

只是澄清了我的原始问题,mylib.h不包含任何Boost头文件,但mylib.cc中的实现不使用boost,并且在mylib.cc中有boost头文件 – user788171

+0

然后只要您使用的Boost块是只有标题(也就是说,您不必链接到任何Boost库),那么您已经设置好了。 – cdhowie

+0

不幸的是,序列化是编译的boost库之一,猜测我运气不好。 – user788171