coreutils学习——单独编译源码

本文分享了coreutils源码的下载、配置及编译过程,解决了编译中遇到的config.h文件缺失等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、源码编译通过:

为了这个源码编译,由于缺乏经验,弄了好久。。。下面把我的经验分享如下:

因为自己把APUE的各个章节算是看了一遍,想通过阅读别人写的代码提高自己的程序能力,网上很多人推荐了coreutils源码。coreutils源码是Linux下面很多小命令的一个集合,里面包含了像cp、mv、cat等命令的源码,因此相信无论是学习SHELL还是学习APUE都是不错的选择。

  • 源码的下载地址可以http://www.gnu.org/software/coreutils/这个网址下载;
  • 下载之后然后解压,可以看到文件夹(我这里是/home/ldh64103/coreutils)里面有configure文件,进入到文件夹里运行./configure;
  • 现在可以看到文件夹里面经过./configure之后生成了Makefile文件;
  • 运行make,这一步需要通过,因为很多源码需要的.h文件(如config.h)都是经过这一步之后生成的;
  • make install是安装程序,这里我们不需要安装。
  • 进入src里面,我们可以看到里面有很多我们以前熟悉命令的.c文件、.h文件和.o文件(经过汇编生成的文件)。
  • 我们复制cat.c文件到我们一个指定的目录(我这里是/tmp/cat);
  • 进入/tmp/cat目录;
  • 现在我们需要对cat.c文件进行单独编译;
  • 在这里犯了很大的错误:因为单独编译的时候直接:gcc cat.c -o cat;这样提示找不到config.h文件,然后网上各种搜解决方法,看到别人用软链接将config.h链接到autoconf.h文件上,各种改cat.c的#include,但是最后都没有解决;因为我不知道config.h是由运行./configure命令自动生成的,在/home/ldh64103/coreutils/lib目录下。原来人家的改符号链接是在编译内核和驱动的情况下使用的。
  • 运行gcc -E -I /home/ldh64103/coreutils -I /home/ldh64103/coreutils/lib -I /home/ldh64103/coreutils/src cat.c -o cat.i;(预处理)
  • 运行gcc -c cat.i -o cat.o;(编译)
  • 运行gcc -L /home/ldh64103/coreutils/lib/ -L /usr/lib cat.o -o cat -lcoreutils -lcrypt;(链接)  -lcoreutils 和 -lcrypt两个是连接两个动态库,两个文件的具体目录大家可以在命令行键入:find -name "libcoreutis.so" -print 来查找libcoreutils.so的目录,从而修改前面两个文件的相应搜索目录;
  • 但是运行的时候还没有通过,提示undefined reference to “Version”;这个还没有找到解决办法,我只能进入到cat.c文件当中把VERSION那行注释掉,这样最终才链接通过。这个问题只有等到将源码阅读一下才能知道怎么解决。
  • 源码还没阅读,现在只是编译通过,嘿嘿,继续加油!
参考博客:http://blog.youkuaiyun.com/endoresu/article/details/6967435 再次感谢这哥们。

Coreutils 软件包包括一整套基本的 shell 工具。 basename 去掉文件名中的目录和后缀 cat 把文本文件的内容发送到标准输出 chgrp 改变文件和目录属组,属组可以使用组名或者组识别号表示 chmod 改变文件和目录的权限,权限可以使用符号或者八进制两种表达方式 chown 改变文件和目录的所有权(包括用户和/或组) chroot 使用特定的目录作为执行某个命令或者交互 shell 的根目录(/)。在多数系统中,只有 root 用户能运行这个命令 cksum 输出指定的每个文件的CRC(循环冗余校验)校验和与字节数 comm 一行一行对两个已经排序的文件进行比较,在第三列中显示同一行是否相同 cp 复制文件 csplit 把一个文件按照给定的模式或者行号分成几块 cut 从指定的文件中提取特定的列送到标准输出 date 以特定的格式显示当前时间,或者设置系统日期 dd 以可选块长度复制文件,默认情况下从标准输入设备输出到标准输出设备。复制过程中,还可以对文件进行一些转换。 df 显示参数中的文件所在分区磁盘空间的使用情况,如果没有给出文件参数就显示所有已经安装的文件系统的可用空间数量。 dir 同 ls dircolors 设置 LS_COLOR 环境变量(用来改变 ls 及相关工具默认颜色组合)。 dirname 显示从文件名去掉非目录后缀之后的内容 du 显示参数使用的磁盘空间的数量,对于参数为目录还会列出每个子目录磁盘空间占用情况。 echo 显示给定字符串或变量值 env 在一个被修改的环境中运行一个程序 expand 把 tab 转换为空格符 expr 执行表达式计算 factor 输出所有指定整数的质因数 false 返回一个不成功或者逻辑假的结果 fmt 重新格式化指定文件的段落 fold 断开指定文件(默认是标准输入)较长的行,在屏幕上显示。 groups 显示一个用户所在的组 head 显示每个指定文件的前几行(默认是10)。 hostid 以16进制方式,显示当前主机的数字标志符。 hostname 显示或设置主机名 id 显示某个用户或者当前用户的真实和有效的 UID、GID 。 install 复制文件,设置它们的权限,如果可能还设置拥有它们的用户和组 join 合并两个文件的行 link 创建从指定文件到指定名称的硬链接 ln 创建文件之间的硬/软(符号)连接 logname 显示当前用户的登录名 ls 列出指定目录的所有内容。缺省是将文件和子目录按字母顺序排列。 md5sum 显示或者校验 MD5 校验码。 mkdir 建立目录,使用给定的参数作为目录名。 mkfifo 以给定的参数作为名字建立FIFO(又叫"命名管道")文件。 mknod 使用给出的文件名,建立一个设备节点,也就是:FIFO、字符特殊文件(special file)或者块特殊文件(special file)。 mv 根据所给参数的不同,把文件或者目录移动到另外的目录或者将其改名 nice 修改某个进程的调度优先级 nl 把每个指定文件的内容写到标准输出,在每行加上行号 nohup 使某个命令不被挂起,并将输出重定向到一个日志文件。 od 以数字方式显示指定文件的内容,默认为八进制。 paste 将字段连接在一起,在字段之间自动插入分割符,默认的分割符是 Tab 。 pathchk 检查文件名是否是有效的或者是可移植的 pinky 一个轻量级的 finger 客户端,用来得到某个用户的信息。 pr 将文件分成适当大小的页送到打印机 printenv 显示环境变量 printf 根据给定的参数格式化输出数据,与 C 语言中的该函数相似。 ptx 为指定的文件提供一个排序索引 pwd 显示当前工作目录 readlink 显示指定符号链接的值 rm 删除文件或者目录 rmdir 删除目录(目录必需为空) seq 以指定的步长输出一个数列 sha1sum 显示或校验 160 位的 SHA1 校验码 shred 安全删除一个文件,重写其占用的磁盘空间,使其无法恢复。 sleep 延迟一段时间 sort 对文件进行排序 split 把文件分成固定大小(字节或行数)的片断 stat 显示文件或者文件系统的状态 stty 改变和显示终端行的设置 sum 显示指定文件的校验和及块数 sync 刷新文件系统缓冲区,使磁盘和内存的数据同步。 tac 逆向显示指定的文
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值