都知道静态库是不能包含动态库的,那么静态库能不能包含静态库呢?
以静态库的本质来说,理应是可以的,经过一番试验之后确定可行:
第一步:创建静态库 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.