经历了重装两次系统,修复引导之后,Ubuntu终于可以正常工作了。中文输入法的ibus和fcitx框架很坑爹,刚开始ibus下的googlepinyin装好了,无奈sublime text中只支持fcitx框架的中文输入,于是试图改成fcitx下的pinyin,无果,最终两个都无法输入中文,没时间了,留待晚上解决,先开始程序。
首先是对apue.3e的make问题,上次说过,make的时候出现cannot find -lbsd错误,但博文(http://blog.csdn.net/jasonque/article/details/8933194)中有一些小错误,正确的命令应该是,
$sudo apt-get install libbsd-dev
具体可参考:http://www.cnblogs.com/cassvin/archive/2011/07/24/linux_qtopia_2.html。
make通过,接下来,就是apue.3e书中图1-3的代码了。先看一遍,目的是ls,即把某个文件夹下的所有文件列出来。sublime text输入之,注意#include ".../apue.h"这里要修改(不修改也行,下一篇会详细说)。
gcc 1_3.c,出错,错误如下:
# gcc 1_3.c /tmp/cchudidN.o: In function `main': 1_3.c:(.text+0x20): undefined reference to `err_quit' 1_3.c:(.text+0x5b): undefined reference to `err_sys' collect2: ld returned 1 exit status
make
will compile all the programs in all the chapters. But the important thing is that before that, it will make the library that will contain the implementations of the functions in apue.h
.(http://unix.stackexchange.com/questions/105483/compiling-code-from-apue)
好吧,其实我也不知道为什么会这样(详见下节),但他提供了一种解决办法:
To compile an example program that you write from the book, run this GCC command (assuming your program's name is myls.c
which is the first in the book):
gcc -o myls myls.c -I SCADDRESS/include/ -L SCADDRESS/lib/ -lapue
-I(是i)告诉gcc include路径在哪里,-L告诉gcc library库的路径,-lapue说要在lib中找include下apue文件对应的libapue.a或者libapue.so,就是找到底在哪里编译过apue.h中的函数。
好吧,其实我自己到这里还没搞懂,晚上十点半了,该回去了,明天再来。
其中,gcc具体步骤包括预处理(preprocessing)、编译(compilation)、汇编(assemble)、链接(linking),分别生成不同后缀的文件,具体见“linux gcc常用命令”:http://www.cnblogs.com/ggjucheng/archive/2011/12/14/2287738.html
那么最后,当然是输入:$./1_3 /dev
这样,就把/dev下所有的文件都列出来了。顺便提一下,关于int main(int argc, char *argv[])中的参数,再回顾一遍。
参数目的就是为了把argument counter和argument vector送给函数处理,argc是命令中所有字符串数目,argv是由这些字符串组成的数组。比如$cat file,这个命令目的是为了输出file的内容,其中argc=2,argv[0]="cat", argv[1]="file"。