linux 静态库创建与使用

jackxiang 2010-10-26 13:27 | |
静态库其实就是一堆.o文件的集合.
下面引用一个例子来说说静态库的创建与使用

//1.c中有一个简单的输出函数 func1
#include <stdio.h>

void func1()
{
printf("call func1\n");
}

//2.c中也有一个简单的输出函数 func2
#include <stdio.h>

void func2()
{
printf("call func2\n");
}


gcc生成目标文件
gcc -c 1.c 2.c
这样会生成1.o 2.o

接下来  我们创建静态库
使用ar命令
ar rv libmytest.a 1.o 2.o
这样就生成了静态库libmytest.a

使用静态库
//test.c
int main()
{
func1();
func2();
return 0;
}

编译
gcc -o test test.c libmytest.a
这样就生成了可执行文件
./test
call func1
call func2


PS:说说ar的简单使用
ar r test.a 1.o 2.o  r选项是插入  将1.o, 2.o插入到test.a中 加上v 会打印提示
ar d test.a 1.o      d选项是删除  将1.o从test.a中删除
ar t test.a          t选项是列出详细信息  打印出test.a中的包含的文件
ar x test.a          x选项是解压  解压出test.a中的文件

来源:http://hi.baidu.com/teng0210/blog/item/8df32a7ae666e3f90ad18780.html

上面的创建是没有问题的,但是你发现没有,1.c 2.c里面都有#include "stdio.h",而这时候对大规模开发程序是没有得到重复用的,
把它放到一个文件里,于是头文件出现了.h文件:
如下目录结构:
include/  lib/  libprint.a  main*  main.cpp  Makefile  print.cpp  run.sh
print.cpp:注意没有包含 stdio.h

#include "print.h"
void printhello(){
printf("Hello, world\n");
}



vi include/print.h :包含了stdio.h
#include <stdio.h>
//#include <cstdio>
void printhello();


vi main.cpp 这儿得包含了print.h了。


#include "print.h"
using namespace std;
int main(void)
{
    printhello();
    return 0;
}


编译如下:
g++ -o ./lib/print.o -c print.cpp -I/root/c++/include
ar q  ./lib/libprint.a  ./lib/print.o
g++  main.cpp -o main  -I/root/c++/include  -L/root/c++/lib  -lprint



./main
Hello, world


把上面的print.cpp 里面的#include "print.h"修改为:#include <stdio.h>,去掉main.cpp里面的#include "print.h",后按照上面开头那样用g++编译,会在最后报错:

# gcc main.cpp ./lib/print.o  
main.cpp: In function ¡®int main()¡¯:
main.cpp:5: error: ¡®printhello¡¯ was not declared in this scop

所以,建议还是加上.h头文件为好!

g++ -c print.cpp -o lib/print.o
cd lib/
ar q libprint.a print.o
cd ..
g++ main.cpp ./lib/libprint.a  
main.cpp: In function ¡®int main()¡¯:
main.cpp:5: error: ¡®printhello¡¯ was not declared in this s sco

全变为:.c后用:
gcc -c print.c -o lib/print.o
cd lib/
ar q libprint.a print.o
cd ..
gcc main.c ./lib/libprint.a

Ok了:
./main
Hello, world

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/3695/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2010-10-26 13:48
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]