文档章节

gcc创建静态库和共享库

o
 osc_mervd488
发布于 2018/04/23 22:45
字数 675
阅读 10
收藏 0

精选30+云产品,助力企业轻松上云!>>>

静态库和动态(共享)库
静态库:编译程序在编译使用库提供的功能代码的程序时将代码复制到该程序然后编译成可执行程序,这种库成为静态库
共享库:共享库比静态库的处理方式更加灵活,因而其产生的可执行文件更小,其文件后缀为 .so,代表共享对象(shared object)
   使用共享库链接的可执行程序只包含了它所需要的函数的表格,并没有从目标文件中复制全部的外部函数的机器代码
  在可执行文件开始执行时,操作系统将外部函数的机器代码从磁盘上的共享文件复制到内存中,这个过程称为动态链接。
  它使可执行文件更加精简而且节省磁盘空间,这是因为共享库可在多个程序间共享
  操作系统允许物理内存中共享库的一个复制被所有正在运行的程序使用,因此能节省内存
  共享库使得程序员可根据需要随时跟新库文件,只要接口不变,那么使用它的源程序就不需要重新编译
  基于这些优点,当系统中同时存在共享库和静态库时,gcc会默认使用共享库文件

当使用lname选项指定库名称时,gcc首先搜索在路径中是否有libname.so文件,如果有则使用该文件,如果没有,则继续查找是否有
libname.a静态库文件
GCC创建静态库文件方法

 

calc.h
int aver(int,int);
int sum(int,int);
aver.c
#include "calc.h"
int aver(int num1,int num2)
{
    return (num1+num2)/2;
}
sum.c
#include "calc.h"
int sum(int num1,int num2)
{
    return (num1+num2);
}
mian.c
#include <stdio.h>
#include "calc.h"

int main(){
    int v1,v2,m,sum2;
    v1=12;
    v2=10;
    m=aver(v1,v2);
    sum2=sum(v1,v2);
    printf("aver(%d,%d)=%d\n",v1,v2,m );
    printf("sum(%d,%d)=%d\n",v1,v2,sum2 );

}

 

编译为目标文件而不进行汇编和链接
gcc -c -o aver.o aver.c
gcc -c -o sum.o sum.c
ar rc libmycalc.a aver.o sum.o
gcc main.c -static -L. -lmycalc -o static-main

linux环境下gcc静态编译/usr/bin/ld: cannot find -lc错误原因及解决方法
原因:
一般出现这个问题的时候,Makefile中肯定有-static选项。这其实是静态链接时没有找到libc.a
需要安装glibc-static.xxx.rpm,如glibc-static-2.12-1.107.el6_4.2.i686.rpm,或是yum install glibc-static

GCC创建共享库文件方法

 

gcc -c -fPIC aver.c -o aver.o
gcc -c -fPIC sum.c -o sum.o
gcc -shared -o libmycalc.so aver.o sum.o
gcc main.c -L. -lmycalc -o shared-main
执行shared-main之前
vim /etc/profile
加上
export LD_LIBRARY_PATH=.
. /etc/profile
shared-main比static-main小的多

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

图解ARP协议(二)ARP***原理与实践

一、ARP***概述 在上篇文章里,我给大家普及了ARP协议的基本原理,包括ARP请求应答、数据包结构以及协议分层标准,今天我们继续讨论大家最感兴趣的话题:ARP***原理是什么?通过ARP***可以做...

osc_91g5cdgs
3分钟前
0
0
shell进度条实现

#!/bin/bashb=''i=0while [ $i -le  100 ]do    printf "progress:[%-50s]%d%%\r" $b $i    sleep 0.1    i=`expr 2 + $i`            b=#$b......

osc_npw5uz1o
5分钟前
8
0
通过ssh实现登录服务器脚本

版本v1 #!/bin/bash########################author: Bovin########################show all host infos of serverList.txtif [[ -f $HOME/.serverList.txt ]]then  hos......

osc_lt2jwwhb
6分钟前
0
0
VMware Fusion下Centos联网

1.VMware Fusion设置选择“网络适配器” 2.“连接我的网络适配器”选择“与我的mac共享” 3.编辑centos的ip配置文件 [root@Centos ~]# more /etc/sysconfig/network-scripts/ifcfg-eth0D...

osc_pg5rp78i
7分钟前
0
0
Kickstart配置文件参数详解

kickstart是什么? KickStart是一种无人值守的安装方法。它的工作原理时在安装过程中记录典型的需要人工干预填写的各种参数,并生成一个名为ks.cfg的文件。如果在安装过程中(不只局限于生成K...

osc_r9yyhhqz
8分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部