静态库其实就是一堆.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
vi include/print.h :包含了stdio.h
vi main.cpp 这儿得包含了print.h了。
编译如下:
把上面的print.cpp 里面的#include "print.h"修改为:#include <stdio.h>,去掉main.cpp里面的#include "print.h",后按照上面开头那样用g++编译,会在最后报错:
所以,建议还是加上.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了:
下面引用一个例子来说说静态库的创建与使用
//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");
}
void printhello(){
printf("Hello, world\n");
}
vi include/print.h :包含了stdio.h
#include <stdio.h>
//#include <cstdio>
void printhello();
//#include <cstdio>
void printhello();
vi main.cpp 这儿得包含了print.h了。
#include "print.h"
using namespace std;
int main(void)
{
printhello();
return 0;
}
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
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
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
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
Hello, world
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/3695/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
最后编辑: jackxiang 编辑于2010-10-26 13:48
评论列表