最新公告
  • 欢迎您光临欧资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • Linux程序设计基础知识对一个保存在什么位置是很重要的

    Linux 编程基础

    在使用编程语言编写程序之前,Linux 开发人员必须彻底了解程序在操作系统中的存储位置。例如,了解软件工具和开发资源的存放位置很重要。下面先简单介绍一下Linux的几个重要子目录和文件。

    虽然这部分内容是针对 Linux 的,但也适用于其他类 UNIX 系统。

    1.3.1 程序安装目录

    Linux 下的程序通常存放在特殊的目录中。系统软件可以在 /usr/bin 子目录中找到。系统管理员为特定主机系统或本地网络添加的程序可以在 /usr/local/bin 子目录中找到。

    系统管理员通常更喜欢使用 /usr/local 子目录,因为它将供应商提供的文件与后来添加的程序以及系统本身提供的程序隔离开来。/usr 子目录的这种布局在需要升级操作系统时很有用,因为只需要保留 /usr/local 子目录的内容。我们建议读者在编译自己的程序时,根据 /usr/local 子目录的树形结构安装和访问相应的文件。

    一些后续安装的软件有自己的子目录结构,其可执行程序也保存在特定的子目录中,最明显的例子是X Window System,它通常安装在一个名为/usr/X11R6的子目录中,这里有各种XFree 86窗口XFree 论坛组织发布的英特尔处理器芯片的系统变体也安装在这里。

    GNU的C语言编译器gcc(在后续的编程示例中使用)通常安装在/usr/bin或/usr/local/bin子目录下,但是通过它运行的各种编译器支持程序一般都保存在其他位置。此位置在用户使用自己的编译器时指定,并且因主机类型而异。对于 Linux 系统,此位置通常是 /usr/lib/gcc-lib/ 目录的子目录,由其版本号标识。GN 的 C/C++ 编译器的各种编译器和 GNU 特定的头文件都存储在这里。

    1.3.2个头文件

    在使用 C 和其他语言进行编程时,我们需要头文件来为系统和库函数调用提供常量和声明的定义。对于 C 语言,这些头文件几乎总是保存在 /usr/include 及其较低的子目录中。取决于正在运行的 UNIX 或 Linux 操作系统的特定版本的头文件通常可以在 /usr/include/sys 或 /usr/include/linux 子目录中找到。其他编程软件也可以有一些预定义的声明文件,它们的存放位置可以由相应的编译器自动找到。例如 X Window 系统的 /usr/include/X1R6 子目录和 GNU C++ 编译器的 /usr/include/g++-2 子目录等。

    在调用C语言编译器时,可以通过给出“-I”编译命令标志来引用保存在下级子目录或非标准位置的头文件。类似的命令如下:

    [david@localhost linux]$ gcc -I /usr/openwin/include hello.c

    该命令使编译器在 /usr/openwin/include 子目录和标准安装目录中查找包含在 fred.c 程序中的头文件。详情请参阅第 3 章。

    使用 grep 命令查找包含某些定义和函数声明的头文件很方便。假设你想知道用于返回程序退出状态的文件名,可以使用如下方法:

    先进入/usr/include子目录,然后在grep命令中给名字的几个字母,如下:

    [david@localhost linux]$ grep KEYSPAN *.h

    pci_ids.h:#define PCI_SUBVENDOR_ID_KEYSPAN 0x11a9

    pci_ids.h:#define PCI_SUBDEVICE_ID_KEYSPAN_SX2 0x5334

    grep 命令将在该子目录中名称以 .h 结尾的所有文件中查找字符串“KEYSPAN”。在上面的示例中,可以找到文件 pci_ids.h(在其他文件中)。

    1.3.3 个库文件

    库文件是编写为可重用的预编译函数的集合。它们通常由一组执行共同工作的相互关联的功能组成。例如,用于处理屏幕显示情况的函数(curses 库)。我们将在后续章节中描述这些库文件。

    标准系统库文件一般存放在 /lib 或 /usr/lib 子目录中。编译时,您告诉 C 编译器(或更准确地说,链接器)要查找哪些库文件。默认情况下,它只会查找 C 语言的标准库文件。这是计算机运行缓慢且 CPU 价格昂贵的时代的遗留问题。当时,将库文件放在标准化的子目录中并希望编译器自己找到它是不切实际的。库文件必须遵循某些命名约定,并且还必须在命令行中明确给出。

    库文件的名称总是以字母lib开头,后跟描述函数库的部分(例如用c表示这是一个C语言库;用m表示这是一个数学运算库,等等。)。文件名的最后一部分以句点 (.) 开头,然后给出库文件的类型,如下所示:

    ● .a 传统静态函数库。

    ● .so 和.sa 共享库(请参阅下面的说明)。

    函数库一般分为静态和共享两种格式。您可以使用 ls /usr/lib 命令检查它。当告诉编译器查找库文件时,它可以给出其完整路径名或使用 -l 标志。详情请参阅第 3 章。

    1. 静态库

    在最简单的形式中,库是一组处于即用状态的二进制目标代码文件。当程序需要使用函数库中的函数时,会通过include语句引用声明该函数的头文件。编译器和链接器负责将程序代码和库函数组合成单个可执行程序。如果您使用的不是标准 C 运行时库而是扩展库,则必须使用 -l 选项指定它。

    静态库也称为档案,它们的文件名按照惯例以 .a 结尾。比如C语言标准库是/usr/lib/libc.a,X11库是/usr/X11R6/lib/libX11.a等。

    自己构建和维护一个静态库并不难。您可以使用 ar(意思是“构建文件”)程序来完成。另外需要注意的是,函数要单独用gcc -c 命令编译。您应该尝试将函数保存到单独的源代码文件中。如果函数需要访问普通数据,可以将它们放在同一个源代码文件中,并使用其中声明为静态类型的变量。

    2. 共享库

    静态库的缺点是,如果我们同时运行多个程序,并且它们都使用同一个函数库中的函数,那么在内存中会存在同一个函数的多个副本,以及程序文件本身的多个副本。一样的备份。这会消耗大量宝贵的内存和硬盘空间。

    许多 UNIX 系统支持共享库,这克服了两者的不必要消耗。对共享库及其在不同系统上的实现的详细讨论超出了本书的范围,因此我们将重点放在直接 Linux 环境中的实现上。

    共享库与静态库存储在同一位置,但文件后缀不同。在典型的 Linux 系统上,C 标准库的共享版本是 /usr/lib/libc.so N,其中 N 是主版本号。

    Linux下C语言编程环境概述

    Linux下C语言编程常用的编辑器是vim或emacs,编译器一般使用gcc,编译链接程序使用make,跟踪调试一般使用gdb,项目管理使用makefile。下面是一个小程序,让你熟悉这些工具的基本应用。每个工具的详细用法将在后面的章节中逐步解释。

    (1)要编辑C源程序,首先要打开vim或emacs编辑器,然后输入以下多个源代码。使用main函数调用mytool1_print和mytool2_print这两个函数。

    #include “mytool1.h”

    #include “mytool2.h”

    int main(int argc, char **argv)

    {

    mytool1_print(“你好”);

    mytool2_print(“你好”);

    }

    (2)在mytool1.h中定义mytool1.c的头文件。

    /* mytool1.h */

    #ifndef_MYTOOL_1_H

    #define_MYTOOL_1_H

    无效 mytool1_print(char *print_str);

    #万一

    (3)使用mytool1.c实现一个简单的打印显示功能。

    /* 我的工具1.c */

    #include “mytool1.h”

    无效 mytool1_print(char *print_str)

    {

    printf(“这是 mytool1 print %s/n”,print_str);

    }

    (4) 在 mytool2.h 中定义 mytool2.c 头文件。

    /* 我的工具2.h */

    #ifndef _MYTOOL_2_H

    #define _MYTOOL_2_H

    无效 mytool2_print(char *print_str);

    #万一

    (5) mytool2.c 实现了类似于 mytool1.c 的功能。

    /* 我的工具2.c */

    #include “mytool2.h”

    无效 mytool2_print(char *print_str)

    {

    printf(“这是 mytool2 print %s/n”,print_str);

    }

    (6)使用makefile文件进行项目管理。makefile文件内容如下。

    main:main.o mytool1.o mytool2.o

    gcc -o main main.o mytool1.o mytool2.o

    main.o:main.c mytool1.h mytool2.h

    gcc -c main.c

    mytool1.o:mytool1.c mytool1.h

    gcc -c mytool1.c

    mytool2.o:mytool2.c mytool2.h

    gcc -c mytool2.c

    (7)在Linux下将源程序文件和makefile文件保存在同一个文件夹中,然后运行make编译链接程序如下:

    [david@localhost 1c]$ 制作

    [david@localhost 1c]$ ./main

    这是 mytool1 打印你好

    这是 mytool2 打印你好

    Linux编程的特点

    编程时,首先要养成良好的编程风格。Linux 操作系统的设计者鼓励人们采用独特的编程风格。以下是 Linux 程序和系统的一些共同特性。

    (1) 简单。许多最有用的 Linux 软件工具都非常简单、小巧且易于理解。

    (2)强调。一个所谓的全功能程序可能既不好用,也不好维护。如果程序只服务一个目的,那么当开发出更好的算法或更好的操作界面时,会更容易随着时间的推移而改进。在 Linux 世界中,小型实用程序通常组合在一起以在需要时完成更大的任务,而不是预测用户需求的巨型程序。

    (3) 可重复性。所使用的程序组件将应用程序的核心部分组装到一个库中。具有简单灵活的编程接口的文档齐全的函数库可以帮助其他人开发类似的项目,或者您可以使用这些技术在新的应用领域。例如,dbm 数据库函数库是具有不同功能的函数的集合,而不是单一的数据库管理系统。

    (4) 可过滤性。许多Linux应用程序都可以用作过滤器,也就是说,它们可以将其输入转换为另一种形式的输出。正如稍后将讨论的,Linux提供了可以将Linux程序组合成相当复杂的应用程序的工具软件,组合方式既新颖又奇特。当然,这种程序组合是有Linux独特的开发方式支持的。

    (5) 开放性。比较成功和流行的Linux程序使用的配置文件和数据文件都是纯ASCII文本。在程序开发中遵循这一原则将是一个很好的实践。它使用户能够使用标准的软件工具修改和搜索配置数据,从而开发新工具,通过新功能处理数据文件。源代码交叉引用检查软件ctags就是一个很好的例子,它以正则的形式记录程序中的符号位置信息检索程序使用的表达式。

    (6) 灵活性。因为你无法预测一个不太聪明的用户会如何使用你的程序,所以在设计你的程序时尽量做到灵活,并尽量避免给数据字段长度或记录添加限制同时,如果可能的话,你应该尝试编写一个可以响应网络访问的程序,这样它既可以跨网络运行,也可以在本地单机上运行。

    Linux下C语言的编码风格

    作为 GN 家族的一员c语言编译器手机版,Linux 拥有数以万计的源代码。在阅读这些源码的时候,我们会发现不同的源码有不同的审美和编程风格c语言编译器手机版,比如下面的glibc代码:

    静态 voidrelease_libc_mem (void)

    {

    /*只有在我们仍然在 mtrace 模式下运行时才调用 free 函数。*/

    如果(商城流!= NULL)

    __libc_freeres();

    }

    或者Linux的核心代码:

    静态 int do_linuxrc(void *shell)

    {

    静态字符 *argv[] = { “linuxrc”, NULL, };

    关闭(0);关闭(1);关闭(2);

    设置ID();

    (void) open(“/dev/console”,O_RDWR,0);

    (void) dup(0);

    (void) dup(0);

    返回 execve(shell, argv, envp_init);

    }

    对比一下,上面的代码是不是顺眼?还有一些程序员编写的程序没有很好的缩进和顺序,让人看起来皱眉。编写干净漂亮的代码不仅使代码更易于阅读,还使代码成为一件艺术品。像微软的匈牙利命名法一样,在 Linux 上编程有两种主要的编程风格:GNU 风格和 Linux 内核风格,下面将对其进行描述。

    1.6.1 GNU 编程风格

    下面是一种基于 GNU 的编程风格,在编写代码时应该遵循这些基本要求。

    ● 将函数开头的左大括号放在最左边,避免将任何其他左大括号、左括号或左方括号放在最左边。

    à 尽量避免两个优先级不同的运算符出现在同一对齐中。

    à 每个程序都应以简要说明其功能的注释开头。例如: fmt – 用于简单填充文本的过滤器。

    ● 请为每个函数写注释,说明函数的作用,需要什么样的参数,参数的可能值是什么意思,以及它们的用途。

    à 声明多个变量时不要跨行。每一行都以一个新的声明开始。

    à 当一个 if 语句嵌套在另一个 if-else 语句中时,使用花括号将 if-else 语句括起来。

    ● 在同一声明中同时指定结构标识符和变量,或结构标识符和类型定义(typedef)。

    à 尽量避免在 if 条件下赋值。

    à 请在名称中使用下划线分隔单词,并尽可能使用小写;为宏和枚举常量以及根据统一约定使用的前缀保留大写。

    à 命令命令行选项时,变量应该在选项含义的描述之后给出,而不是在选项字符之后。

    1.6.2 Linux 内核编程风格

    以下是Linux内核所需的编程风格:

    ● 注意缩进格式。

    ● 将左大括号放在行尾,将右大括号放在行首。

    ● 命名系统。保持变量名称尽可能短。

    ● 函数要简洁明了,一个函数应该只做一件事。

    ● 注释。注释描述了代码的作用,而不是它是如何工作的。

    看完以上两种风格的介绍,读者是不是觉得太多记不住了?没关系,Linux 有很多工具可以帮助我们。除了 vim 和 emacs,还有一个非常有趣的小工具 indent 可以帮助我们美化 C/C++ 源代码。

    让我们使用这个命令将 Linux 内核编程风格的程序 quan.c 转换为 GNU 编程风格。代码如下:

    [david@localhost ~]$ indent -gnu quan.c

    使用缩进工具,你可以轻松写出漂亮的代码。

    LinuxC编程工具介绍

    在实际开发中,C语言代码除了最基本的语法规范外,还必须符合设计者的逻辑意图。如果发现生成的可执行文件的执行结果不正确,可以通过相应的调试环境进行跟踪调试。所以你需要使用 gdb

    一.GDB 基本 gdb 命令

    利用

    1.调用gdb一般只需要一个参数

    gdb 1

    2.一旦被调试程序出错,会在当前目录生成一个core memory image core文件,调用时可以指定一个core文件

    gdb  core1

    3.确定进程号的执行方式

    gdb  1

    3.应用实例

    二.项目管理工具make1.Simple就是一个例子

    1).新建一个hello.c

    2).新建一个hello.h

    // 这里什么都不做

    无效 m();

    1

    2

    3)。编译生成文件

    # 在这里写评论

    # 命令行前面必须有一个表空间

    你好:你好.c你好.h

    gcc -o 你好你好.c 你好.h

    1

    2

    3

    4

    5

    6

    4.管理下一个

    lancao@lancao:~$ make //直接输入make命令,会根据makefile文件信息执行文件

    gcc -o hello hello.c hello.h //系统执行的语句

    lancao@lancao:~$ ls

    hello hello.c hello.h makefile //目标文件生成

    2.接下来我们看一个稍微复杂一点的makefile

    二.makefile 中的变量

    (1)Makefile 中符号的含义:

    $@ 代表目标文件

    $^ 表示所有依赖文件

    lt; 表示第一个依赖文件

    美元?表示比目标更新的依赖文件列表

    1

    2

    3

    4

    (2)通配符、notdir、patsubst 的意思是:

    通配符:扩展通配符

    notdir : 删除路径

    patsubst : 替换通配符

    1

    2

    3

    4

    autotools 自动生成 makefile

    关注+后台私信;信息; 两个字可以免费获取信息。内容包括:C/C++、Linux、golang、Nginx、ZeroMQ、MySQL、Redis、fastdfs、MongoDB、ZK、流媒体、CDN、P2P、K8S、Docker、TCP/IP、Coroutines、DPDK、Embedded等。.

    站内大部分资源收集于网络,若侵犯了您的合法权益,请联系我们删除!
    欧资源网 » Linux程序设计基础知识对一个保存在什么位置是很重要的

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    欧资源网
    一个高级程序员模板开发平台

    发表评论