gcc创建静态库和共享库
静态库和动态(共享)库
静态库:编译程序在编译使用库提供的功能代码的程序时将代码复制到该程序然后编译成可执行程序,这种库成为静态库
共享库:共享库比静态库的处理方式更加灵活,因而其产生的可执行文件更小,其文件后缀为 .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)/;
}
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=;
v2=;
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小的多
gcc创建静态库和共享库的更多相关文章
- 第二课 GCC入门之静态库以及共享库
序言: 前面一课讲了gcc的简单入门,包括gcc编译步骤:预处理:编译:汇编:链接.今天这节课就来讲下linux的库也欢迎大家吐糟共同学习. 原理: linux系统中分为2种库:静态库和共享库.静态库 ...
- Linux下库的制作(静态库与共享库)
库中实际上就是已编译好的函数代码,可以被程序直接调用. Linux下的库一般的位置在/lib或者/usr/lib中 静态库 静态库是复制拷贝到调用函数中的,函数运行的时候不再需要静态库,因为静态库是在 ...
- Linux 静态库与共享库的使用
申明: 正如题如示,本篇讲的是Linux下是静态库与共享库,而Window下的动态链接库详细情况可见这篇文章:windows动态链接库 DLL 浅析.虽然原理,思想差不多,但是细节却各有不同. 一.静 ...
- 【转】Linux 静态库与共享库的使用
原文网址:http://blog.csdn.net/heyabo/article/details/11688517 申明: 正如题如示,本篇讲的是Linux下是静态库与共享库,而Window下的动态链 ...
- linux下的静态库和共享库
转载&&增加: 我们在编写一个C语言程序的时候,经常会遇到好多重复或常用的部分,如果每次都重新编写固然是可以的,不过那样会大大降低工作效率,并且影响代码的可读性,更不利于后期 ...
- Linux命令(十二)制作静态库和共享库
1. 静态库 静态库文件命名:libxxxx.a 1.1 步骤: ar rcs libCalc.a *.o 1.2 用nm查看文件内容 1.3 发布并使用 gcc main.c -o mycpp.ou ...
- Linux静态库和共享库
1.什么是静态库静态库类似windows中的静态lib 关于windows中的静态lib,可参考 Windows动态链接库DLL 特点:包含函数代码声明和实现,链接后所有代码都嵌入到宿主程序中. 只在 ...
- Linux静态库和共享库【转】
转自:http://www.cnblogs.com/zlcxbb/p/6806269.html 1.什么是静态库 静态库类似windows中的静态lib 关于windows中的静态lib,可参考 Wi ...
- ubuntu下借助qt creator创建属于自己的共享库
简介: 在 Windows 上,共享库由 .dll 表示:在 Linux 上,由 .so 表示. Shared Library的优势 共享库,又称动态库或so文件,顾名思义,它可以在可执行文件启动时加 ...
随机推荐
- 使用 slf4j抽象日志层 和 其他日志实现对接
前言 如果你正在提供一个开源的Java-jar,那么让你的项目仅依赖slf4j-api然后让你的用户在他们开发和运营环境中选择任意的日志实现绝对是个好想法,.作为终端用户,他们可以快速地从上面提到的日 ...
- LXC学习实践(3)快速体验第一个容器
1.搭建第一个 LXC 虚拟计算机 #yum install lxc* 2.安装软件包后要检查 Linux 发行版的内核对 LXC 的支持情况,可以使用下面命令 #lxc-checkconfig #l ...
- .NET:持续进化的统一开发平台
阅读文本大概需要 8 分钟. 标题使用的是进化这个词语,是因为 .NET 在不断的努力,也在不断的重构. 这篇文章的更多目的和意义在于科普,俗称"传教". # 持续进化的 .NET ...
- 分享:纯 css 瀑布流 和 js 瀑布流
分享一次纯 css 瀑布流 和 js 瀑布流 纯 css 写瀑布流 1.multi-columns 方式: 通过 Multi-columns 相关的属性 column-count.column-ga ...
- java stream 原理
java stream 原理 需求 从"Apple" "Bug" "ABC" "Dog"中选出以A开头的名字,然后从中选 ...
- WebBench的安装与使用
webbench最多可以模拟3万个并发连接去测试网站的负载能力. 一.编译安装 1.上传压缩包到虚机里,rz webbench-1.5.tar.gz 2.解压 tar zxvf webbench-1. ...
- 记录下项目中常用到的JavaScript/JQuery代码二(大量实例)
记录下项目中常用到的JavaScript/JQuery代码一(大量实例) 1.input输入框监听变化 <input type="text" style="widt ...
- HTML的各种基本标签
一 .head中的各种标签 1. <!DOCTYPE html><html>文档类型声明 声明当前文件是一个HTML5文件文档 ...
- Python面向对象——重写与Super
1本文的意义 如果给已经存在的类添加新的行为,采用继承方案 如果改变已经存在类的行为,采用重写方案 2图解继承.重写与Super 注:上面代码层层关联.super()可以用到任何方法里进行调用,本文只 ...
- 大数据处理架构hadoop
Hadoop简介 Hadoop是Apache软件基金会旗下的一个开源分布式计算平台,为用户提供了系统底层细节透明的分布式基础架构.它是基于java语言开发的,具有很好的跨平台特性,其核心是分布式文件系 ...