Linux动静态库
gcc编译过程
- 预处理,
gcc -E,.c->.i展开宏和头文件,替换条件编译,删除注释、空白和空行 - 编译,
gcc -S,.i->.s检查语法规范 【消耗时间和系统资源最多】 - 汇编,
gcc -c,.s->.o将汇编指令编译成汇编指令 - 链接,
gcc,.o->.out,数据段合并,数据地址回填,连接成可执行文件
gcc -E aa.c -o aa.i
- -o 用来指定生产的文件名
编译参数
- 指定头文件
当头文件和主文件不在一个目录时。
# I 指定头文件的目录
$ gcc -I ./head/ aa.c -o aa
或者在引入头文件时,指定相对路径
#include "./head/bb.h"
- -I 头文件
- -c 只做预处理、编译、汇编。得到二进制文件
- -g 编译调试 ,gdb
gcc aa.c -o aa.out -g
gdb aa.out
- -v | --version 查看gcc版本号
- -On n=0-3 编译优化,n越大优化的越多
嵌入式开发一般不需要优化:
int a = 1; // 表示指示灯的开关过程
a = 0;
a = 1;
a = 0;
a = 1;
a = 0;
a = 1;
- -Wall 提示更多警告信息,如定义变量未使用
- -D 编译时定义宏,注意-D和之间没有空格
下面这段程序将编译出错。
#include "./head/bb.h"
#ifdef HELLO
#define HI 20
#endif
int main()
{
printf("hello world. %d\n", HI);
return 0;
}
$ gcc aa.c
但是可以这样编译:
gcc aa.c -D HELLO
- -E 生产预处理文件
- -M 生成.c文件与头文件以来关系用户makefile
静态库
制作
# 生成 add.o,汇编
$ gcc -c add.c
$ gcc -c sub.c
$ ar rcs libmymath.a sub.o add.o
使用
因为在链接时期,将程序复制到程序中。所以我们在编译时期应该会发出未定义警告,但是编译器会帮我们做隐式声明。
如何链接?
# 直接指定静态库
$ gcc test.c libmymath.a -o test -Wall
test.c:6:2: warning: implicit declaration of function ‘add’ [-Wimplicit-function-declaration]
add();
# 编译器会做隐式声明
解决警告:
- 方法一:在主文件中声明原型
#include <stdio.h>
// 声明原型
long add();
void sub();
int main()
{
printf("test...");
add();
sub();
}
不推荐使用
- 方式二:
在静态库源码中,添加mymath.h文件,必须要编译
#ifndef _MYMATH_H_
#define _MYMATH_H_
void add();
void sub();
#endif
包含头文件
#include <stdio.h>
#include "./resource/mymath.h"
int main()
{
printf("test...");
add();
sub();
return 0;
}
gcc test.c libmymath.a -o test -Wall
文件结构
├── inc
│ └── mymath.h
├── lib
│ └── libmymath.a
├── resource
│ ├── aa.c
│ ├── add.c
│ ├── add.o
│ ├── sub.c
│ └── sub.o
├── test.c
动态库
Linux动静态库的更多相关文章
- gcc使用及动静态库制作
一. GCC的使用 1. GCC的编译过程 (1)预处理(cpp)gcc -E(输出问价通常以 .i 结尾),将头文件展开,宏替换等操作: (2)编译器(gcc)gcc -S(输出问价以 .s 结尾) ...
- Linux下静态库生成和使用
Linux下静态库生成和使用 一.静态库概念 1.库是预编译的目标文件(object files)的集合,它们可以被链接进程序.静态库以后缀为”.a”的特殊的存档(archive file)存储. ...
- linux上静态库链接的有关问题
求大神,linux下静态库链接的问题有两个文件和一个库,a.c, b.c,libh.a,其中b.c里面会有调用libh.a的函数func1,现在将a.c, b.c,libh.a编译链接生成可执行文件, ...
- Linux上静态库和动态库的编译和使用
linux上静态库和动态库的编译和使用(附外部符号错误浅谈) 这就是静态库和动态库的显著区别,静态库是编译期间由链接器通过include目录找到并链接到到可执行文件中,而动态库则是运行期间动态调用,只 ...
- linux下静态库的制作
在我们编写软件的过程当中,少不了需要使用别人的库函数.因为大家知道,软件是一个协作的工程.作为个人来讲,你不可能一个人完成所有的工作.另外,网络上一些优秀的开源库已经被业内广泛接受,我们也没有必要把 ...
- linux连接静态库
在项目中发现,使用 -l连接某个库时,如果存在同名的静态库(.a)和动态库(.so),默认会连接.so 那么如何指定连接静态库呢?如果有多个库,有些要连接静态库.有些要连接动态库,连接选项该如何指定呢 ...
- gcc总结【基本用法】【选项】【动静态库】(转)
1.////////////////////////////////////////////////////////////////////////////////////////////////// ...
- linux c: 静态库和动态库的生成和使用
场景: main函数需要两个接口,一个求和函数,一个打印函数. int sum(int i, int j); 求两个int数字的和. void show(int i, char* name); 打印i ...
- [转帖]Linux 的静态库与动态库
Linux下的静态库与动态库 2017年02月18日 09:17:13 LLZK_ 阅读数:10257 标签: linux动态库静态库区别使用 更多 个人分类: Linux学习笔记 所属专栏: Lin ...
随机推荐
- IDEA call Hierarchy 双击跳转源码后绿色选中背景不消失问题
1.版本,2019.2.2. 2.这个问题貌似是个bug,就是选中变色后会一直在,目前没有找到对应方法或者配置,如果你找到了,欢迎在评论中分享一下. 3.我这里只能先简单粗暴处理下,通过设置选中时不设 ...
- static关键字的作用是什么?
static的作用:常用来修饰变量. 全局变量被static修饰后,就称之为静态全局变量:局部变量被static修饰后,就称之为静态局部变量.统称为静态变量. 如果需要进一步解释下面的现象,可以了解i ...
- Curl常用函数介绍
一.LibCurl基本编程框架 在基于LibCurl的程序里,主要采用callback function (回调函数)的形式完成传输任务,用户在启动传输前设置好各类参数和回调函数,当满足条件时libc ...
- iframe结构的网站按F5刷新子页面的实现方式
有的网站或者后台系统由于页面有公共的部分,比如菜单,会把公共的部分放在一个页面,这里称之为父页面,而把具体的内容放入一个iframe中,之后的请求改变iframe的内容.但是这样会有一个问题,因为浏览 ...
- 分布式事务中间件 TCC-Transaction 源码分析 —— 项目实战
https://blog.csdn.net/lldouble/article/details/79455172
- [aac @ ...] Specified sample format s16 is invalid or not supported
在使用FFmpeg打开编码器的时候出现以下错误: [aac @ 000001da19fd7200] Specified sample format s16 is invalid or not supp ...
- web前端面试第一次[addEventListenr();绑定事件]
//当一个元素同时处理多个函数,这里使用按钮 //addEventListener(string类型,处理函数,boolean); <input type="button" ...
- 若块级元素被设置为 display: table-cell 便无法设置宽度
工作中,遇到表格的单元格中的 div 设置宽度无效,后来是发现 div 被设置为 display: table-cell ,后将其修改为 display: block 则设置的宽度生效.
- Java并发编程:Java内存模型JMM
简介 Java内存模型英文叫做(Java Memory Model),简称为JMM.Java虚拟机规范试图定义一种Java内存模型来屏蔽掉各种硬件和系统的内存访问差异,实现平台无关性. CPU和缓存一 ...
- VS2017+EF6+MySQL8.0配置(.Net Framework 4.5)
开发环境Vs2017 运行环境:.Net Framework 4.5(win7专业版 64位) 1.下载安装mysql数据库版本:mysql-8.0.19-winx64 ----数据库版本貌似跟My ...