Linux编译过程与动静态库制作

一、Linux编译过程

  1. 预处理->编译->汇编->链接

二、预处理

  1. 作用:

    • 宏展开
    • 头文件包含
    • 条件编译
    • 布局控制,如#pragma;添加行号,方便后期问题查错。
  2. 编译命令
    • gcc -E  *.c  -o  *.i

三、编译

  1. 作用:

    • 将预处理生成的代码进行词法、语法与语义进行解析,生成汇编代码。
  2. 命令:
    • gcc -S *.i -o *.s

四、汇编

  1. 作用:

    • 将汇编代码进行处理,转换成计算机能识别指令集,生成目标文件(.o/.obj)。
  2. 命令:
    • gcc -c *.s -o *o

五、链接

  1. 作用

    • 将目标文件与依赖库进行链接,生成可执行文件。
    • 链接器:包括符号解析(代码引用与定义占位符结合,即根据引用符号,找到定义占位符)与重定向(定义占位符与地址集合,即根据定义占位符,从依赖文件中找到代实现代码)。
  2. 命令
    • gcc  *.o -o 可执行文件名称 [-L/库路径 -l库名]
  3. 说明
    • 若链接库路径下,同时存在同名的静态库与动态库,则默认链接动态库,若要链接静态库,需要添加“-static”;

六、动静态库的作用与区别

  1. 作用:

    • 库文件,用于打包代码块,实现代码复用,方便后期开发。
  2. 区别:
    • 动静态库制作命令。
    • 静态库,在链接时,将代码拷贝到引用处,生成目标文件。动态库,在链接时,在引用处添加占位符,在运行时,在动态库中找到代码块运行。
  3. 制作命令:
    • 动静态库制作,都基于目标文件,链接生成库文件。
    • 静态库制作命令:ar -rcs libxxx.a *.o
    • 动态库制作命令:gcc -fPIC -c *.s -o *.o + gcc -shared *.o -o libxxx.so 或 gcc -fPIC -shared *.c -o libxxx.so
  4. 静态库的优缺点:
    • 优点:静态库,在链接时,将代码拷贝到引用处,生成目标文件。在运行时,不需携带静态库,运行可执行文件。运行速度较动态库快。
    • 缺点:链接时,因进行代码拷贝,生成目标文件较大。运行时,因不再依赖库文件,若有功能变更,则涉及功能变动的模块都需要重新编译,不便于后期功能升级。
  5. 动态库的优缺点:
    • 优点:链接时,只添加引用占位符;运行时,以代码复用形式运行,不需要代码块拷贝,生成可执行文件较小;方便升级更新(更换对应库即可)。
    • 缺点:运行可执行文件时,需要携带动态库。在运行时,进行函数调用(入栈出栈),运行速度较静态库慢。

原文地址:https://www.cnblogs.com/-Newbie/p/12591375.html

时间: 2024-08-09 12:05:01

Linux编译过程与动静态库制作的相关文章

linux下编译qt5.6.0静态库——configure配置

 随笔 - 116  文章 - 4  评论 - 7 linux下编译qt5.6.0静态库--configure配置 linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberry选项: Android 选项: 生成makefile 遇到链接检查失败的情况 生成makefile后进行编译 编译时的错误 多重定义'QT_MODBUS()'和'QT_MODBU

技巧:Linux 动态库与静态库制作及使用详解

技巧:Linux 动态库与静态库制作及使用详解 标准库的三种连接方式及静态库制作与使用方法 Linux 应用开发通常要考虑三个问题,即:1)在 Linux 应用程序开发过程中遇到过标准库链接在不同 Linux 版本下不兼容的问题: 2)在 Linux 静态库的制作过程中发现有别于 Windows 下静态库的制作方法:3)在 Linux 应用程序链接第三方库或者其他静态库的时候发现链接顺序的烦人问题.本文就这三个问题针对 Linux 下标准库链接和如何巧妙构建 achrive(*.a) 展开相关介

gcc总结【基本用法】【选项】【动静态库】(转)

1.//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// linux下c编程起步一:掌握gcc基本用法 初学时最好从命令行入手,

将静态库制作成动态库

一.系统说明 Ubuntu12.04TLS 64位 二.制作静态库 (1)编写需要制作成静态库的程序(根据实际情况进行编写,这里只是一个简单例子)     //bar.h              #ifndef _BAR_H     #define _BAR_H          void bar(int i);          #endif     //bar.c     #include <stdio.h>     #include <stdlib.h>     #incl

zt:我使用过的Linux命令之ar - 创建静态库.a文件

我使用过的Linux命令之ar - 创建静态库.a文件 本文链接:http://codingstandards.iteye.com/blog/1142358    (转载请注明出处) 用途说明 创建静态库.a文件.用C/C++开发程序时经常用到,但我很少单独在命令行中使用ar命令,一般写在makefile中,有时也会在shell脚 本中用到.关于Linux下的库文件.静态库.动态库以及怎样创建和使用等相关知识,参见本文后面的相关资料[3]<关于Linux静态库和动态库的分析>. 常用参数 格式

iOS 最新framework和.a静态库制作及使用全解

最近想把自己的一些实用工具类搞成一个静态库,网上搜了下关于framework和.a的一些相关资料,然而写的或不全面,或不详细,我归纳总结及亲自实践写下这篇文章. 一.framework和.a两种静态库的介绍及区别 .a是一个纯二进制文件,.framework中除了有二进制文件之外还有资源文件. .a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用. .a + .h + sourceFile = .framework. .a只是静态库.framework既可以是静态库也

Xcode6.1标准Framework静态库制作方法。工程转Framework,静态库加xib和图片。完美解决方案。

http://www.cocoachina.com/bbs/read.php?tid-282490.html Xcode6.1标准Framework静态库制作方法.工程转Framework,静态库加xib和图片.完美解决方案. 在cocoachina呆挺长时间了.没什么大贡献.就整理了这个,希望对大家有帮助.绝对原创.呵呵. 1.创建一个工程,或者在原有的工程上进行.不在列举.2.在原有工程上添加一个静态库 2.1.选择OS X 的Bundle.因为Xcode6.1中iOS里没有Bundle.

静态库制作-混编(工程是oc为基础)

最近工作需要,需要制作一些静态库.由于缺乏经验,特意找了一些资料,加上自己的测试.特意在此记录一些心得和踩过的坑.所谓“好记性不如烂笔头”,希望自己以后忘记的时候能回头来看看,同时也希望对后来者能提供一定的帮助. 这里,我只写对我来说是难点的地方. 首先,framework是静态库.是用oc编写的.如果静态库制作好了,没问题的话,无论是放到oc项目还是swift项目,都不应该有问题.其中,swift与oc互调也不会有问题.难点在于,在编写framework的时候,如果framework本身是混编

linux动静态库使用

#include<stdio.h> #include "cac.h" int main(void) { printf("add = %d\n" ,add(5,3)); printf("sub = %d\n" ,sub(5,3)); return 0; } int add(int a,int b) { return a+b; } int sub(int a,int b) { return a-b; } int add(int a,int