都知道静态库是不能包含动态库的,那么静态库能不能包含静态库呢?
以静态库的本质来说,理应是可以的,经过一番试验之后确定可行:
第一步:创建静态库 libother.a
other.h:
#ifndef OTHER_H #define OTHER_H extern "C" { void vFuncOther(); } #endif
other.cpp:
#include "other.h" #include <iostream> using namespace std; void vFuncOther() { cout<<"vFuncOther is call."<<endl; }
Makefile:
object = other.o .PHONY default : default : $(object) ar rsv libother.a $(object) other.o : other.cpp $(CXX) $(CXXFLAG) -c other.cpp .PHONY clean : clean : rm $(object)
输入make得到libother.a静态库文件
第二步:创建包含libother.a的静态库libmy.a
首先将第一步生成的libother.a静态库文件与头文件拷贝至libmy.a的工作目录。
my.h:
#ifndef MY_H #define MY_H extern "C" { void vFuncMy(); } #endif
my.cpp:
#include "my.h" #include "other.h" #include <iostream> using namespace std; void vFuncMy() { cout<<"vFuncMy will call vFuncOther later."<<endl; vFuncOther(); }
Makefile:
object = my.o libother.a .PHONY default : default : $(object) ar rsv libmy.a $(object) my.o : my.cpp $(CXX) $(CXXFLAG) -c my.cpp .PHONY clean : clean : rm $(object)
值得注意的是,这个Makefile是错的,但静态库的编译不会有问题。
第三步:用一个控制台程序测试静态库libmy.a
将第二步生成的libmy.a与my.h拷贝至控制台程序工作目录。
main.cpp:
#include "my.h" int main() { vFuncMy(); return 0; }
代码很简单,用g++编译并链接:
[enjolras@enjolras test]$ g++ -o main main.cpp -lmy -L./ .//libmy.a(my.o): In function `vFuncMy': my.cpp:(.text+0x2b): undefined reference to `vFuncOther' collect2: ld returned 1 exit status
报undefined reference,也就是说,在libmy.a中找不到vFuncOther。
原因很简单:
[enjolras@enjolras test]$ ar t libmy.a my.o libother.a
libother.a中的other.o,被包多了一层,所以函数vFuncOther就找不到了,那解决办法就很简单了。
修改第二步的Makefile:
object = my.o .PHONY default : default : $(object) ar x libother.a ar rsv libmy.a *.o my.o : my.cpp $(CXX) $(CXXFLAG) -c my.cpp .PHONY clean : clean : rm $(object)
重新make之后,替换libmy.a再次测试:
[enjolras@enjolras test]$ g++ -o main main.cpp -lmy -L./ [enjolras@enjolras test]$ ./main vFuncMy will call vFuncOther later. vFuncOther is call.
done.