linux c编程入门

来源:互联网 发布:java搭建视频服务器 编辑:程序博客网 时间:2024/05/22 00:47

看的书是《linux C 编程从入门到精通》
vim的使用
命令:
i:光标前输入
I:光标所在行行首输入
a:光标后输入
A:光标所在行行尾输入
o:光标所在行下面!!!插入新的一行
O:光标所在行上面!!!插入新的一行
x:单个删除
dd:整行删除
gcc 的安装和设置
gcc默认安装,还缺少头文件和库文件,所以不能工作。即需要安装build-essential
默认安装目录为/usr/bin/gcc 或者 /usr/bin/g++
开发的头文件在/usr/include中
查看gcc -v

robot@ubuntu:~$ gcc -vUsing built-in specs.COLLECT_GCC=gccCOLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapperTarget: x86_64-linux-gnuConfigured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.4-2ubuntu1~14.04.3' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnuThread model: posixgcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3) 

gcc 的使用
-c 源文件编译成目标文件*。o
-o filename 指定可执行文件名
-g 或者 -gdb 在可执行文件中加入调试信息,可以用gdb调试
-O[0,1,2,3] 对生成的代码进行优化,数字为优先级别,默认为2级优化,0为不优化,一般不同时使用 -g -O?
-Dmacro[=def] 将名为macro的宏定义为def,如果括号中的部分为默认值,则宏被定义为1
-Idir 将dir目录添加到头文件的搜寻目录中,优于gcc 默认搜索目录。在多个-I 时,按照前后顺序搜索
-Ldir 将dir目录添加到库文件的搜寻目录中,优于gcc默认搜索目录。在多个-L时,按照前后顺序搜索
-lname 指定链接库,在-Ldir 和/lib /usr/lib中寻找。没有使用-static时,优先使用name.so
-static 禁止与共享库链接
-shared 尽量与共享库链接。
libname.a 静态库
libname.so 动态库
helloworld.c 编译命令
gcc helloworld.c —– a.out
gcc helloworld.c -o hello —–hello
gcc helloworld.c -c —–helloworld.o

make 和makefile
测试程序:

//f2.h/*******f2()******/void f2();//f2.c#include <stdio.h> void f2(){    printf("hello f2!! \n");}//main.c#include "f2.h"#include <stdio.h>int main(){    printf("hello world! \n");    f2();    return 0;}

makefile

test:f2.o main.o    gcc -o hello f2.o main.of2.o:f2.h f2.c    gcc -c f2.cmain.o:main.c    gcc -c main.cclean:    rm -f test *.o

gcc -o hello f2.o main.o
相当于 gcc -c f2.c
gcc -c main.c
gcc -o hello f2.o main.o

  此处test是构建目标,当你写入make命令时,make将将一行的目标进行构建。  make也可以指定你要构建的目标,比如      make f2.o   则只把f2.o当作目标,只考其所依赖文件的更新。  该功能在伪目标的功能、用法类似。  一般.o文件默认将。c文件作为依赖文件,同名

语法:
目标:依赖项列表
【TAB】【命令】

一般从上到下设计,一般头一个目标为最终编译目标,逐渐展开如果目录下不是makefill Makefill 则可以make -f filenamemake -p 打印除所有宏定义和描述内部规则的相关行make -n 只运行不执行make -d 相当于--debug,输出有关文件和检测时间的详细信息

这里写图片描述
变量
大写,一般习惯
作用:保存文件名列表;保存编译器参数;
定义法:变量名=字符串
引用法:把变量名用()括起来,前面加上$

这里写图片描述

makefile默认变量

AR 归档维护程序的名称,默认值arARFLAGS 归档维护程序的选项AS 汇编程序的名称,默认值asASFLAGS 汇编程序的选项CC c语言编译器的名称,默认值为cc ,cc是/usr/bin/cc - > /usr/bin/gcc, 软连接还是硬连接CFLAGS c语言编译器的选项CPP 带有标准输入的C语言预处理程序,默认值$(CC)-ECPPFLAGS c语言预编译器的选项。c++ 是CXXRM 删除文件命令,即rm -f$* 不包含扩展名的目标文件名称$+ 所有的依赖文件$< 第一个依赖文件的名称$? 所有的依赖文件,$@ 目标的完整名称$^ 所有的依赖文件$% 如果目标是归档成员,则该变量表示目标的归档成员名称

伪目标:all clean等
伪目标并不是最终生成的程序文件,只是为了形成一条规则。

这里写图片描述
all 这一句有目标和依赖条件,后面没有命令行!!!所以make不会执行任何动作!!!只检测依赖文件的更新情况
all 该文件并不存在。
clean 这一句没有依赖文件!!!所以在make时,不会被执行。
只有在make clean 时,才会把clean作为目标,并执行删除命令。
另一个伪目标.PHONY:clean
两个作用:
防止目录下有同名为“”clean“”的文件,而先将clean声明为伪目标,这样make就不会去检查该目标是否存在于磁盘。
另一个作用。。。

原创粉丝点击