gcc编译静态库和动态库

一、动态链接库

1.创建hello.so动态库

  1. #include <stdio.h>   
  2. void hello(){  
  3.     printf("hello world\n");  
  4. }  
  5. 编译:gcc -fPIC -shared hello.c -o libhello.so  
#include <stdio.h>
void hello(){
	printf("hello world\n");
}
编译:gcc -fPIC -shared hello.c -o libhello.so

2.hello.h头文件

  1. void hello();  
void hello();

3.链接动态库

  1. #include <stdio.h>   
  2. #include "hello.h"   
  3.   
  4. int main(){  
  5.     printf("call hello()");  
  6.     hello();  
  7. }  
  8. 编译:gcc main.c -L. -lhello -o main  
#include <stdio.h>
#include "hello.h"

int main(){
	printf("call hello()");
	hello();
}
编译:gcc main.c -L. -lhello -o main
这里-L的选项是指定编译器在搜索动态库时搜索的路径,告诉编译器hello库的位置。"."意思是当前路径.


3.编译成够后执行./main,会提示:

  1. In function `main':  
  2.    
  3. main.c:(.text+0x1d): undefined reference to `hello'  
  4. collect2: ld returned 1 exit status  
In function `main':
 
main.c:(.text+0x1d): undefined reference to `hello'
collect2: ld returned 1 exit status
这是因为在链接hello动态库时,编译器没有找到。
解决方法:
  1. sudo cp libhello.so /usr/lib/  
sudo cp libhello.so /usr/lib/
这样,再次执行就成功输入:
call hello()


二、静态库

文件有:main.c、hello.c、hello.h
1.编译静态库hello.o: 

  1. gcc hello.c -o hello.o  #这里没有使用-shared  
gcc hello.c -o hello.o  #这里没有使用-shared

2.把目标文档归档

  1. ar -r libhello.a hello.o  #这里的ar相当于tar的作用,将多个目标打包。  
ar -r libhello.a hello.o  #这里的ar相当于tar的作用,将多个目标打包。
程序ar配合参数-r创建一个新库libhello.a,并将命令行中列出的文件打包入其中。这种方法,如果libhello.a已经存在,将会覆盖现在文件,否则将新创建。

3.链接静态库

  1. gcc main.c -lhello -L. -static -o main  
gcc main.c -lhello -L. -static -o main
这里的-static选项是告诉编译器,hello是静态库。
或者:

  1. gcc main.c libhello.a -L. -o main  
gcc main.c libhello.a -L. -o main
这样就可以不用加-static

4.执行./main

输出:call hello()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值