1. linux程序

Linux应用程序表现为两种特殊类型的文件:可执行文件脚本文件

可执行文件:是计算可以直接运行的程序,相当于windows的.exe文件。

脚本文件:一组指令的集合。这些指令由另一个程序(即解释器)来执行,它们相当于Windows下的.bat文件、.cmd文件。

使用(:)分隔PATH变量的条目。MS-DOS和windows使用分号(;)。

Linux使用正斜线(/)分隔文件名里的目录名。

2. C语言编译器

编译、链接和运行hello程序:

zhangxin@zhangxin-VirtualBox:~/mypro$ gcc -o hello hello.c
zhangxin@zhangxin-VirtualBox:~/mypro$ ./hello
hello world !

程序名(hello)前加“./”是指示shell去执行当前目录下给定名称的程序。

-o name 选项告诉编译器将可执行程序放在何处。如果不写,编译器会把程序放在一个名为a.out(assembler output即汇编输出)的文件里。

3. 开发系统导引

3.1 应用程序

(1)/usr/bin  : 系统为正常使用提供的程序,包括用于程序开发的工具,都可在目录/usr/bin中找到。

(2)/usr/local/bin 或者 /opt : 系统管理员为某个特定的主机或网络添加的程序。

(3)系统管理员喜欢使用/usr/local目录,因为它分离了厂商提供及后续添加的文件与系统本身的应用程序。

3.2 头文件

(1)对C语言来说,头文件在/usr/include目录及其子目录下。依赖于特定linux版本的头文件通常在/usr/include/sys和/usr/include/linux中找到。

(2)调用C语言编译器时,可以使用-I标志来包含保存在子目录或者非标准位置中的include文件。

gcc -I/usr/openwin/include fred.c

上例指示不仅在标准位置,也在/usr/openwin/include目录中查找fred.c中包含的头文件。

3.3 库文件

库是一组预先编译好的函数的集合。

标准系统库文件一般存储在/lib和/usr/lib目录中。

.a : 传统的静态函数库。

.so :共享函数库。

-l :标志指示编译器要搜索的库文件。

-L :编译器增加库的搜索路径。

3.4 静态库

静态库,也称归档文件(archive)。

静态库实验:

(1)为两个函数创建源文件,add.c和sub.c:

//add.c
#include <stdio.h>

int add(int a, int b){
return a + b;
}

//sub.c
#include <stdio.h> int sub(int a, int b){
return a - b;
}

(2)分别编译这些函数,产生要包含在库文件中的目标文件。

zhangxin@zhangxin-VirtualBox:~/mypro$ gcc -c add.c sub.c
zhangxin@zhangxin-VirtualBox:~/mypro$ ls
add.c add.o hello.c sub.c sub.o

-c :阻止编译器创建一个完整的程序。(-c Compile and assemble, but do not link)

(3)创建一个头文件,将声明库文件中的函数。

//lib.h

int add(int, int);
int sub(int, int);

(4)调用程序(program.c)。

//program.c
#include <stdio.h>
#include "lib.h" int main(){ printf(" 5 + 4 = %d\n", add(, ));
printf(" 5 - 4 = %d\n", sub(, ));
return ;
}

(5)编译并测试这个程序。

zhangxin@zhangxin-VirtualBox:~/mypro$ gcc -c program.c
zhangxin@zhangxin-VirtualBox:~/mypro$ gcc -o program program.o add.o sub.o
zhangxin@zhangxin-VirtualBox:~/mypro$ ls
add.c add.o hello.c lib.h program program.c program.o sub.c sub.o
zhangxin@zhangxin-VirtualBox:~/mypro$ ./program
+ =
- =

(6)创建并使用一个库文件。

用ar程序创建一个归档文件并将目标文件添加进去。

zhangxin@zhangxin-VirtualBox:~/mypro$ ls
add.c add.o hello.c lib.h program program.c program.o sub.c sub.o
zhangxin@zhangxin-VirtualBox:~/mypro$ ar crv libcalc.a add.o sub.o
a - add.o
a - sub.o
zhangxin@zhangxin-VirtualBox:~/mypro$ ls
add.c add.o hello.c libcalc.a lib.h program program.c program.o sub.c sub.o

(7)要想成功的使用函数库,还需要为函数库生成一个内容表。

randlib libcalc.a

在编译器命令行的文件列表中添加该库文件以创建我们的程序:

zhangxin@zhangxin-VirtualBox:~/mypro$ ls
add.c add.o hello.c libcalc.a lib.h program.c program.o sub.c sub.o
zhangxin@zhangxin-VirtualBox:~/mypro$ gcc -o program program.o libcalc.a
zhangxin@zhangxin-VirtualBox:~/mypro$ ls
add.c add.o hello.c libcalc.a lib.h program program.c program.o sub.c sub.o
zhangxin@zhangxin-VirtualBox:~/mypro$ ./program
+ =
- =

nm命令:查看目标文件、函数库或者可执行程序里所包含的函数。

3.5 共享库

程序使用共享库时,链接方式是这样的:它本身不包含函数代码,而是引用运行时可访问的共享代码。

linux和windows文件对比:

项目 UNIX WINDOWS
目标模块 .o .obj
静态函数库 .a .lib
程序 program(a.out) program.exe
共享库 .so .dll

参考资料:《Linux程序设计》第3版

Linux程序设计(一)入门的更多相关文章

  1. 5)Linux程序设计入门--信号处理

    )Linux程序设计入门--信号处理 Linux下的信号事件 前言:这一章我们讨论一下Linux下的信号处理函数. Linux下的信号处理函数: 信号的产生 信号的处理 其它信号函数 一个实例 .信号 ...

  2. 6)Linux程序设计入门--消息管理

    )Linux程序设计入门--消息管理 前言:Linux下的进程通信(IPC) Linux下的进程通信(IPC) POSIX无名信号量 System V信号量 System V消息队列 System V ...

  3. 2)Linux程序设计入门--进程介绍

    )Linux程序设计入门--进程介绍 Linux下进程的创建 前言: 这篇文章是用来介绍在Linux下和进程相关的各个概念.我们将会学到: 进程的概念 进程的身份 进程的创建 守护进程的创建 .进程的 ...

  4. 3)Linux程序设计入门--文件操作

    )Linux程序设计入门--文件操作 Linux下文件的操作 前言: 我们在这一节将要讨论linux下文件操作的各个函数. 文件的创建和读写 文件的各个属性 目录文件的操作 管道文件 .文件的创建和读 ...

  5. 1)Linux程序设计入门--基础知识

    )Linux程序设计入门--基础知识 Linux下C语言编程基础知识 前言: 这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将 会学到以下内容: 源程序编译 Makef ...

  6. 8)Linux程序设计入门--线程操作

    )Linux程序设计入门--线程操作 前言:Linux下线程的创建 介绍在Linux下线程的创建和基本的使用. Linux下的线程是一个非常复杂的问题,由 于我对线程的学习不时很好,我在这里只是简单的 ...

  7. 7)Linux程序设计入门--网络编程

    )Linux程序设计入门--网络编程 Linux系统的一个主要特点是他的网络功能非常强大.随着网络的日益普及,基于网络的 应用也将越来越多. 在这个网络时代,掌握了Linux的网络编程技术,将令每一个 ...

  8. linux程序设计——个人总结

    linux程序设计--个人总结 到今天为止,<linux程序设计>学习基本完毕了.从五月下旬開始接触linux,学习安装Ubuntu14.04,六月份開始学习<linux程序设计&g ...

  9. Linux 运维入门到跑路书单推荐

    一.基础入门 <鸟哥的Linux私房菜基础学习篇>:最具知名度的Linux入门书<鸟哥的Linux私房菜基础学习篇>,全面而详细地介绍了Linux操作系统. https://b ...

随机推荐

  1. php tpl 模板页面如和给js文件传参数

    有一个参数,服务器传给了php 模板页面,但模板包含的js需要得到这个参数值.如何处理: 一,在引入页面前加一句代码 <script type="text/javascript&quo ...

  2. Docker入门

    -----------------------------------------Docker入门教程(一)介绍Docker入门教程(二)命令Docker入门教程(三)DockerFileDocker ...

  3. 15个Docker基本命令及用法

    Docker入门教程:15个Docker基本命令及用法   本文中,我们将学习15个Docker命令以及命令的用法和功能,并通过实践学习它是如何工作的. AD:51CTO 网+ 第十二期沙龙:大话数据 ...

  4. Xcode报错:Unexpected '@' in program

    今天犯了个很弱的错误,就是当定义个一个@property时,编译器直接报错:Unexpected '@' in program 原因是把定义的属性写在.m文件中了,改到.h文件中就好了... 以后大家 ...

  5. C语言面试题(嵌入式开发方向,附答案及点评)

    整理自C语言面试题(嵌入式开发方向,附答案及点评) 预处理器(Preprocessor) 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SEC ...

  6. 如何监控 Tomcat?Zabbix 与 Cloud Insight 对比

    JVM 监控工具有很多,像命令 jstat,jmap,jstack,jinfo 可以根据不同需求查看不同的系统信息,还有图像化界面 jconsole,都是很方便的工具.这些可以参考 JAVA自带监控工 ...

  7. Java final知识点

    被final修饰的值,只可以被赋值一次. 被final修饰的类,其所有方法就变成了final方法,该类也不能被继承. 被final修饰的方法,不能在子类中重写. public static void ...

  8. 李洪强漫谈iOS开发[C语言-025]-赋值运算符案例

  9. MySQL源码 数据结构array

    MySQL源码中自己定义了许多数据结构,放在mysys的目录下,源码中通常都使用这些数据结构来组织存放数据,也更容易实现跨平台.   下面先来看下MySQL定义的动态数组: [源代码include/a ...

  10. Java 编程下 Eclipse 如何设置单行代码显示的最大宽度

    Eclipse 下一行代码的默认宽度是 80 , 稍长一点的一行代码就会自动换行,代码可读性较差,我们可以自己在 Eclipse 对代码宽度进行设置. 设置路径为:[Window]→[Preferen ...