Linux-C基础编程
GCC工作流程
工作流程
1.预处理 -E xxx.c —> xxx.i
宏替换;头文件展开;注释去掉;
gcc -E hello.c -o hello.i
2.编译 -S xxx.i —> xxx.s #最浪费时间的操作
gcc -S hello.i -o hello.s
3.汇编 -C xxx.s —> xxx.o
gcc -c hello.s -o hello.o
4.链接 (无参数) xxx.o —> xxx(可执行文件)
gcc hello.o -o hello
GCC参数
-o 指定生成的文件的名字
-I 编译时,指定头文件的路径 gcc sum.c -I ./include/ -o sum
-c 将汇编文件生成二进制文件(即:.o文件) gcc sum.c -c -I ./include/ #生成sum.o文件
-g gdb调试时,需要加的参数 gcc hello.c -o app -g
-D 在编译时,指定一个[宏] gcc hello.c -I ./include/ -D DEBUG -o hello
-Wall 添加警告(warning)信息
-On 优化代码,n是优化级别:1,2,3
库的使用
简介
库是什么
二进制格式的源代码 (.c,.cpp)
以头文件的形式提供给用户使用
静态库和动态库的制作和使用
目录结构
test //根目录
include //头文件存放位置
calc.h //calc头文件
lib //存放库文件
libadd.a libsum.so //静态库和动态库
add.c
sum.c
main.c
Makefile
文件内容
calc.h
#ifndef __CALC_H__
#define __CALC_H__
int add(int a,int b);
int sum(int a,int b);
#endif
add.c
#include <calc.h>
int add(int a,int b)
{
return (a+b);
}
sum.c
#include <calc.h>
int sum(int a,int b)
{
return (a-b);
}
main.c
#include <stdio.h>
#include <calc.h>
main()
{
int a=6,b=5;
int the_add=add(a,b);
int the_sum=sum(a,b);
printf("a+b=%d\na-b=%d\n",the_add,the_sum);
}
Makefile
all: main
main: main.c libadd.a libsum.so
gcc main.c -o app -I ./include/ -L ./lib/ -ladd -lsum
lib: libadd.a libsum.so
libadd.a: add.o
ar rcs libadd.a add.o
cp libadd.a ./lib/
add.o: add.c
gcc -c add.c -I ./include/
libsum.so: sum.o
gcc -shared -o libsum.so sum.o
cp libsum.so ./lib/
sum.o: sum.c
gcc -fPIC -c sum.c -o sum.o -I ./include
clean:
rm -rf *.o *.so *.a app
动态库编译运行错误解决办法
在运行生成的二进制文件时可能会报以下错误:


用 ldd 命令查看发现,libsum.so地址找不到
原因
file app #查看可知app是elf格式的可执行程序
对于 elf 格式的可执行程序,是由 ID-linux.so 来完成的
它先搜索 elf 文件的 DT_RPATH 段——环境变量 LD_LIBRARY_PATH——/etc/id.so.cache 文件列表
——/lib/,/usr/lib 目录找到库文件后将其载入内存。
如何让系统找到共享库
临时设置
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库路径
永久生效
用户级别:
vi ~/.bashrc # 最后一行添加 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库路径
source ~/.bashrc #或者重启终端
系统级别:
修改 /etc/profile 文件
拓展链接:跟我一起写Makefile
标准C库函数和Linux系统函数的区别
c库IO函数的工作流程
Linux系统函数就没有f了


c库函数与系统函数的关系


一些链接:
虚拟地址空间


文件描述符


Linux-C基础编程的更多相关文章
- [Linux] awk基础编程
1.awk每次读一行数据,如果设置了-F选项,是在这一行使用分隔符分,$0是全部 2.awk由模式和动作组成 3.条件判断模式{动作} a.txt aaa bbb aaa ccc ddd cat a. ...
- linux shell基础编程2
while循环 语法1: while [ 条件 ] do 命令序列 done 语法2: while read -r line do 命令序列 done (切记while和左中括号一定要有空格) 例子 ...
- Linux 高性能服务器编程——Linux网络编程基础API
问题聚焦: 这节介绍的不仅是网络编程的几个API 更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系. 这节主要介绍三个方面的内容:套接字(so ...
- linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO(转载)
IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作.那么我们对与外部设备的操作都可以看做对文件进行操作.我们对一个文件的读写,都通过调用内核提供的系统调用:内核给我们返回一个file ...
- Linux应用程序设计之网络基础编程
1.TCP/IP协议概述 1.1.OSI参考模型及TCP/IP参考模型 OSI协议参考模型是基于国际标准化组织(ISO)的建议发展起来的,从上到下工分为7层:应用层,表示层,会话层,传输层,网络层,数 ...
- 【Hadoop离线基础总结】linux的shell编程
linux的shell编程 基本了解 概述 Shell是一个用C语言编写的程序,通过shell用户可以访问操作系统内核服务,它类似于DOS下的command和后来的cmd.exe.Shell既是一种命 ...
- 【Linux基础总结】Shell 基础编程
Shell 基础编程 重启虚拟机遇到磁盘损坏如何解决 Shell编程中变量的声明.引用及作用域 Shell程序 概述 以文件形式存放批量的Linux命令集合,该文件能够被Shell解释执行,这种文件就 ...
- Linux之V4L2基础编程
Linux之V4L2基础编程 本文内容来源于网络,本博客进行整理. 1. 定义 V4L2(Video For Linux Two) 是内核提供给应用程序访问音.视频驱动的统一接口. 2. 工作流程: ...
- 【Linux教程】Linux系统零基础编程入门,想当大神?这些你都要学
✍ 文件和文件系统 文件是Linux系统中最重要的抽象,大多数情况下你可以把linux系统中的任何东西都理解为文件,很多的交互操作其实都是通过文件的读写来实现的. 文件描述符 在Linux内核中,文件 ...
- 20191310李烨龙Linux C语言编程基础
Linux C语言编程基础 任务详情 0. 基于Ubuntu或OpenEuler完成下面的任务(OpenEuler有加分) 1. 选择教材第二章的一节进行编程基础练习(2.10,2.11,2.12,2 ...
随机推荐
- SQL优化:索引的重要性
开篇小测验 下面这样一个小SQL 你该怎么样添加最优索引 两个表上现在只有聚集索引 bigproduct 表上已经有聚集索引 ProductID bigtransactionhistory 表上已经有 ...
- sklearn6_生成分类数据
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...
- 20155315 2016-2017-2 《Java程序设计》第七周学习总结
教材学习内容总结 第12章 Lambda语法 Lambda定义 一个不用被绑定到一个标识符上,并且可能被调用的函数. 在只有Lambda表达式的情况下,参数的类型必须写出来,如果有目标类型的话,在编译 ...
- tclsh 用法
set foo "a bc" # 定义变量 set b {$a}; # 转义 b的值为" $a " ,而不是变量结果 ; incr a ; # 数字的自增. 将 ...
- Java使用WebSocket
网页端的消息推送,一般有以下方式: 轮询方式:客户端定时向服务端发送ajax请求,服务器接收到请求后马上返回消息并关闭连接. 优点:后端程序编写比较容易. 缺点:TCP的建立和关闭操作浪费时间和带宽, ...
- bzoj 1432 数学(找规律)
我们可以发现所有的情况(除n=1时),都可以找到两个交叉的直线,就是第一层的那 两个线段所在的直线如图中左 那么我们以这个为准,两边对称着加直线,会得到右图,每一层是折线,且每 加一对儿就多两条线段, ...
- 过滤掉文本中的javascript标签代码
2014年1月21日 11:51:19 php代码: $content = preg_replace('#<\s*[script].*>#', '', $a);//有些攻击可以在scrip ...
- HP服务器 开启ILO
=============================================== 2018/11/4_第1次修改 ccb_warlock == ...
- tortoise svn 忽略bin、obj等文件夹
项目空白处右击 =>TortoiseSVN => Properties => New => Other => svn:global-ignores value => ...
- visual studio code插件精选
HTML Snippets 超级实用且初级的 H5代码片段以及提示 HTML CSS Support 让 html 标签上写class 智能提示当前项目所支持的样式 JavaScript Atom G ...