现在的位置: 首页 > 综合 > 正文

静态库包含静态库

2013年10月15日 ⁄ 综合 ⁄ 共 1652字 ⁄ 字号 评论关闭

都知道静态库是不能包含动态库的,那么静态库能不能包含静态库呢?

以静态库的本质来说,理应是可以的,经过一番试验之后确定可行:

第一步:创建静态库 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.

抱歉!评论已关闭.