linux c编程入门

看的书是《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 -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
Target: x86_64-linux-gnu
Configured 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-gnu
Thread model: posix
gcc 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.o
f2.o:f2.h f2.c
    gcc -c f2.c
main.o:main.c
    gcc -c main.c
clean:
    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 filename
make -p 打印除所有宏定义和描述内部规则的相关行
make -n 只运行不执行
make -d 相当于--debug,输出有关文件和检测时间的详细信息

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

这里写图片描述

makefile默认变量

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值