相关学习资料

http://gcc.gnu.org/
https://gcc.gnu.org/onlinedocs/
http://zh.wikipedia.org/zh/GCC
http://blog.csdn.net/casularm/article/details/316149
http://www.bccn.net/Article/kfyy/cyy/jc/200409/9.html
http://linux.chinaunix.net/techdoc/develop/2008/12/16/1053006.shtml
http://www.91linux.com/html/article/program/cpp/20071203/8745.html
http://www.cnblogs.com/hnrainll/archive/2012/07/05/2578277.html
http://www.cnblogs.com/ggjucheng/archive/2011/12/14/2287738.html
http://www.chinaunix.net/old_jh/23/408225.html
http://blogimg.chinaunix.net/blog/upfile/070907021605.pdf

目录

. GCC简介
. GCC的编译
. GCC的命令行参数
. GCC编译中遇到的常见错误
. Makefile
. Makefile Example

1. GCC简介

GCC(GNU Compiler Collection GNU 编译器家族)。GCC目前可以支持:

. C
. Ada
. C++
. Java
. Objective C
. Pascal 语言
. COBOL
. 函数式编程
. 逻辑编程的Mercury等等

GCC目前几乎支持所有的硬件(处理器)架构

2. GCC的编译

一个程序编译过程是分为四个阶段进行的,即:

. 预处理(也称预编译,Preprocessing)
. 编译(Linking)
. 汇编 (Assembly)
. 连接(Linking)

使用gcc指令可以一步完成,也可以单步独立进行,方便程序员获取中间代码代码,进行调试

0x0: 编写源代码

aaarticlea/png;base64,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" alt="" />

0x1: 预处理(也Preprocessing)

预处理是C语言程序从源代码变成可执行程序的第一步,主要是C语言编译器对各种预处理命令进行处理,包括:

. 头文件的包含: #include
. 宏定义的扩展:
) #define: 定义一个预处理宏
#define MACRO_NAME(args) tokens(opt)
之后出现的MACRO_NAME将被替代为所定义的标记(tokens). 宏可带参数, 而后面的标记也是可选的.
) #undef: 取消宏的定义
#define除了可以独立使用以便灵活设置一些参数外,还常常和条件编译语法结合使用,以便灵活地控制代码块的编译与否,也可以用来避免同一个头文件的多次包含
. 条件编译的选择:
) #ifdef: 判断某个宏是否被定义, 若已定义, 执行随后的语句
) #ifndef: 与#ifdef相反, 判断某个宏是否未被定义
) #if: 编译预处理中的条件命令, 相当于C语法中的if语句
) #elif: 若#if, #ifdef, #ifndef或前面的#elif条件不满足, 则执行#elif之后的语句, 相当于C语法中的else-if
) #else: 与#if, #ifdef, #ifndef对应, 若这些条件不满足, 则执行#else之后的语句, 相当于C语法中的else
) #endif: #if, #ifdef, #ifndef这些条件命令的结束标志.
) #line: 标志该语句所在的行号
. 编译器指示指令(给编译器看的指令)
) #pragma: 说明编译器信息
#pragma用编译器用来添加新的预处理功能或者显示一些编译信息. #pragma的格式是各编译器特定的, gcc的如下:
#pragma GCC name token(s)
) #warning: 显示编译警告信息
#warning, #error分别用于在编译时显示警告和错误信息
#error tokens
) #error: 显示编译错误信息
#warning tokens

gcc预处理指令:

gcc -E test.c -o test.i(输出预处理内容到文件)
gcc -E test.c(输出预处理内容到命令行)

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjsAAAGdCAIAAAB7GSViAAAgAElEQVR4nO2dWbotR3XnYzx7CJ5CvtcMiu/LAdQQ8p0BFOA0xhiQcNku4yZcNGownSQwAl1dYZdBEkgC3XNFd3mresideSOjWbEiInPv3Of8fl8+nCZ3xMoVzT+j2bHMK4+fvvL201fefvry23cvv3338qMnLz168tJbsevRk5cePXn50ZOXHz155e27Vx7fvepe79y9+s7dq4+ffvudzPXq4+W6+/bjp99+7P7FvT555fHT8Hr57fX1+OnLbz99ab6+9fbTbz26+9ajp9969PSbj54uP0zXN956+o237r7+1tOvv/X06z99+n/m619/8vRff/LU/uTO/uTOvnln37z7lzfv/uXNu39+8+6f37z7pzfv/unHT/7px0/+8cdP/vHHd9P1tR/ffe3f7/7h3+/+4d+f/O8fna+//9GTv//hk7//4ZO/+9Hd3/3o7m9/dPe3P7z72x8++V/L9caTv/Gu18/XV4PrxdeevPjax9Hrhej1g/z1Ff31/cz15e/9Rr7cm6fcX3zt4xdem57r7sXX7158/emLrz998fVPpuuF15++MP3wxicvvPHbF17/7Quv//Yrr//2K6+ffy673jhfL25xfbXi+uEG198c/oqY/cZvv/rGJ19945PJDy++8cn5ev2TF19/+sJyvfb0K6/dna8f3H3lB0++8oMnX/7Bky9//8mXv//xl7//8Ze+//GXvvfxl773m7/+3m/++rvT9esvfvfXX/zOr//qOx/91b+dry/824df+PaHf/ntD87Xqx/85au/+vyrv/r8K7/8i+V6+Zfjy++PL70/vvTe+NJ7f/7Se3/+rel693Pfevdz3zxfn/3mLz77zV989hvn6zPf+Plnvr66/ufX/2u5PvP1n3/mG+frs9/4xee++Ys//9a740vv/8XLv/z8q7/6wrc//KvvfPTF7/76S9/7+Mvff/KV1+5eeG2u7W+Il+ul156+4Pjny7N/Zs+4zhE9s/jk1V99/pXZMzGffM5xyNobPw+98fxK++Evv/3BF/7twy9+56O//u5vvvT9j7/8g7MrXphdca4n6hZh3n/yp+l678mz9548e+9j/3o3cb338bP3l9uebH+9G73S9rz78bNfpK+f/2Z1/Vfs+r+/Xl3/OV0f/fE/P/rjf6yu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" alt="" />

0x2: 编译(Linking)

C语言编译器会进行如下步骤进行编译过程:

. 词法分析
. 语法分析: 通过-std指定遵循哪个标准
. 代码优化和存储分配: 根据优化(-O)要求进行
. 接着会把源代码翻译成中间语言,即汇编语言(因为C/C++是编译性语言)

gcc编译指令:

gcc -S test.i -o test.s(-S选项,表示在程序编译期间,在生成汇编代码后,停止,-o输出汇编代码文件)

aaarticlea/png;base64,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" alt="" />

0x3: 汇编(Assembly)

把作为中间结果的汇编代码翻译成了机器代码,即目标代码(可以在目标机器运行的机器码),这一步其实就是我们在进行汇编编程中的汇编编译过程。这一步产生的所谓机器代码还不可以直接运行,还需要下一步的链接程序进行链接后才可以

对于这一步的工作来说,我们可以使用:

. as汇编工具来汇编AT&T格式的汇编语言,因为gcc产生的中间代码就是AT&T格式的
. 或者直接用gcc的汇编编译器来进行汇编编译

这一步执行后,得到的就已经是机器码了

. 用as把汇编语言汇编成目标代码
//注意,这里的.s文件是上一步编译后的文件
as -o test.o test.s . gcc汇编指令
gcc -c test.s -o test.o

aaarticlea/png;base64,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" alt="" />

0x4: 链接(Linking)

链接的目的是处理可重定位文件(.so、.dll),重定位是将"符号引用"与"符号定义"进行链接的过程。这句话可以这么理解,我们在写代码中会使用到很多的函数和变量,这些"函数名"、和"变量名"最终需要被转换为对应的虚拟内存地址,CPU才可以执行,这个过程就是链接过程
链接又分为:

. 静态链接
程序开发阶段程序员用ld(gcc实际上在后台调用了ld)静态链接器手动链接的过程
例如:
如果链接到可执行文件中的是静态连接库libmyprintf.a,那么. rodata节区在链接后需要被重定位到一个绝对的虚拟内存地址,以便程序运行时能够正确访问该节区中的字符串信息 . 动态链接
动态链接则是程序运行期间系统调用动态链接器(ld-linux.so)自动链接的过程
例如:
对于puts,因为它是动态连接库libc.so中定义的函数,所以会在程序运行时通过动态符号链接找出puts函数在内存中的地址,以便程序调用该函数

关于交叉编译

交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上,比如在我们地PC平台(X86 CPU)上编译出能运行在sparc CPU平台上的程序,编译得到的程序在X86 CPU平台上是不能运行的,必须放到sparc CPU平台上才能运行。当然两个平台用的都是linux。这种方法在异平台移植和嵌入式开发时用得非常普遍。
相对与交叉编译,我们平常做的编译就叫本地编译,也就是在当前平台编译,编译得到的程序也是在本地执行。
用来编译这种程序的编译器就叫交叉编译器,相对来说,用来做本地编译的就叫本地编译器,一般用的都是gcc,但这种gcc跟本地的gcc编译器是不一样的,需要在编译gcc时用特定的configure参数才能得到支持交叉编译的gcc。
为了不跟本地编译器混淆,交叉编译器的名字一般都有前缀,比如sparc-xxxx-linux-gnu-gcc、sparc-xxxx-linux-gnu-g++等等
交叉编译器使用方法跟本地的gcc差不多,但有一点必须要注意的是:必须用-L和-I参数指定编译器用sparc系统的库和头文件,不能用本地(X86)的库,例如

sparc-xxxx-linux-gnu-gcc test.c -L/path/to/sparcLib -I/path/to/sparcInclude

3. GCC的命令行参数

Usage: gcc [options] file...
Options:
) -combine: 一次传给gcc多个源文件
) -save-temps: 保留中间文件
) -B <directory>: 添加gcc搜索的源文件路径
) -E 源代码file: 只单独进行预处理(预编译)这一步
) -S 预处理后的file: 只单独进行编译这一步
) -c 编译后待汇编的文件: 只进行编译和汇编这两步
) -o <file>: 输出文件 ) -l参数
-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,库名和真正的库文件名之间有一个对应关系呢,例如数学库,他的库名是m,他的库文件名是libm.so,把库文件名的头lib和尾.so去掉就是库名了
值得注意的是,-l参数在搜索指定库名的时候会从gcc默认的"库路径"下去查找
. /lib
. /usr/lib
. /usr/local/lib
所以,如我们自已要用到一个第三方提供的库名字叫libtest.so,那么我们只要把libtest.so拷贝到这些路径中(例如/usr/lib)
example:
编译时加上-ltest参数,我们就能用上libtest.so库了(我们还需要与libtest.so配套的头文件,对我们需要使用的函数进行声明,我们才能在代码中使用)
) -L参数
我们都知道,放在里的库直接用-l参数就能链接了,但如果库文件没放在这三个目录里,而是放在其他目录里,这时我们只用-l参数的话,链接还是会出错,出错信息大概是:"/usr/bin/ld: cannot find -lxxx",也就是链接
程序ld在那3个目录里找不到
-L参数跟着的是库文件所在的目录名。再比如我们把libtest.so放在/aaa/bbb/ccc目录下,那链接参数就是-L/aaa/bbb/ccc -ltest ) -include
-include用来包含头文件,但一般情况下包含头文件都在源码里用#include xxxxxx实现,所以-include参数很少用
) -I参数
-I参数是用来指定头文件目录。/usr/include目录一般是不用指定的,gcc知道去那里找(默认路径),但是如果头文件不在/usr/include里我们就要用-I参数指定了,比如头文件放在/myinclude目录里,那编译命令行就要加上
"-I/myinclude"参数了,如果不加你会得到一个"xxxx.h: No such file or directory"的错误
-I参数可以用相对路径,比如头文件在当前目录,可以用-I.来指定 ) -O参数
这是一个程序优化参数,一般用-O2就是,用来优化程序用的,比如
gcc test.c -O2 -o test
优化得到的程序比没优化的要小,执行速度可能也有所提高。关于编译原理、优化的相关知识又是另一类庞大的体系了,以后有时间可以研究一下 ) -shared参数
编译动态库时要用到,比如gcc -shared test.c -o libtest.so

4. GCC编译中遇到的常见错误

0x1: undefined reference to 'xxxxx'错误

这是链接(Linking)错误,不是编译(Linking)错误,已经到了第4步出错的,也就是说如果只有这个错误,说明你的程序源码本身没有问题,是你用编译器编译时参数用得不对

reason:
可能是由于没有指定链接程序要用到得库,比如你的程序里用到了一些数学函数,那么你就要在编译参数里指定程序要链接数学库

solution: 在编译命令行里加入程序要用到的库,

0x2: libxxxx.so未建立软链接报错

大部分libxxxx.so只是一个链接,比如

libm.so它链接到/lib/libm.so.x
/lib/libm.so.6链接到/lib/libm-2.3..so

如果没有这样的链接,还是会出错,因为gcc ;loader只会找libxxxx.so,所以如果你要用到xxxx库,而只有libxxxx.so.x或者libxxxx-x.x.x.so,做一个链接就可以了,例如

ln -s libxxxx-x.x.x.so libxxxx.so

很多库开发包提供了生成链接参数的程序,名字一般叫xxxx-config,一般放在/usr/bin目录下,比如gtk1.2的链接参数生成程序是gtk-config,执行gtk-config --libs就能得到以下输出

"-L/usr/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic -lgmodule -lglib -ldl -lXi -lXext -lX11 -lm"

这就是编译一个gtk1.2程序所需的gtk链接参数

5. Makefile

0x1: Makefile规则格式

makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则(rules)来指定

. 哪些文件需要先编译
. 哪些文件需要后编译
. 哪些文件需要重新编译
. 甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令

makefile带来的好处就是"自动化编译",一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率
make是一个linux下的命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make

/*
1. 变量声明
在Makefile中声明变量
var = value;
在需要使用value的地方直接使用$(var)就可以了
*/ /*
2. Makefile的隐含规则
在使用make编译.c源文件时,编译.c源文件规则的命令可以不用明确给出。这是因为make本身存在一个默认的规则,能够自动完成对.c文件的编译并生成对应的.o文件。它执行命令"cc -c"来编译.c源文件。在Makefile中我们只需要
给出需要重建的目标文件名(一个.o文件),make会自动为这个.o文件寻找合适的依赖文件(对应的.c文件。对应是指:文件名除后缀外,其余都相同的两个文件),而且使用正确的命令来重建这个目标文件
*/ TARGET... : PREREQUISITES...
COMMAND
...
...
/*
3. 清理工作
Makefile规则除了完成源代码编译之外,也可以完成其它任务。例如实现清除当前目录中编译过程中产生的临时文件
1) 通过".PHONY"特殊目标将"clean"目标声明为伪目标。避免当磁盘上存在一个名为"clean"文件时,目标"clean"所在规则的命令无法执行
2) 在命令行之前使用"-",意思是忽略命令"rm"的执行错误 值得注意的是,目标"clean"没有出现在终极目标"target"依赖关系中(终极目标的直接依赖或者间接依赖),所以我们执行"make"时,目标"clean"所在的规则将不会被处理。当需要执行此规则,要在make的命令行选项中明确指定这
个目标,即执行"make clean"
*/
.PHONY:clean
clean:
-rm target $(var) . target: 规则的目标
通常是最后需要生成的文件名或者为了实现这个目的而必需的中间过程文件名。可以是:
) .o文件
) 最后的可执行程序的文件名
) 一个make执行的动作的名称,如目标"clean",我们称这样的目标是"伪目标" . prerequisites: 规则的依赖
生成规则目标所需要的文件名列表。通常一个目标依赖于一个或者多个文件。当规则的目标是一个文件,在它的任何一个依赖文件被修改以后,在执行"make"时这个目标文件将会被重新编译或者重新连接 . command: 规则的命令行
规则所要执行的动作(任意的shell命令或者是可在shell下执行的程序),它限定了make执行这条规则时所需要的动作。一个规则可以有多个命令行,每一条命令占一行。
需要注意的是:每一个命令行必须以[Tab]字符开始,[Tab]字符告诉make此行是一个命令行。make按照命令完成相应的动作
命令(command)就是在任何一个目标的依赖文件发生变化后重建目标的动作描述。一个目标可以没有依赖而只有动作(指定的命令)。比如Makefile中的目标"clean",此目标没有依赖,只有命令。它所定义的命令用来删除make过程产生
的中间文件(进行清理工作)

从概念上来说,一个Makefile文件是由一个个的规则组成,每个规则包括: target、prerequisites、command
make程序根据规则的依赖关系,决定是否执行规则所定义的命令的过程我们称之为"执行规则"

0x2: Makefile运行流程

. 当在shell提示符下输入"make"命令以后。make读取当前目录下的Makefile文件,并将Makefile文件中的第一个目标作为其执行的"终极目标",开始处理第一个规则,默认的情况下,make执行的是Makefile中的第一个规则,此
规则的第一个目标称之为"最终目的"或者"终极目标"。结合Makefile的工作原理就会很好理解为什么第一个规则会是"最终规则",因为Makefile的规则是递归依赖的,最终规则递归地依赖于下面的其他规则 . make在执行这个规则所定义的命令之前,首先处理目标"终极目标"的所有的依赖目标,可能是:
) 伪目标
) .so文件
对.o文件为目标的规则处理有下列三种情况:
2.1) 目标.o文件不存在,使用其描述规则创建它
2.2) 目标.o文件存在,目标.o文件所依赖的.c源文件、.h文件中的任何一个比目标.o文件"更新"(在上一次make之后被修改),则根据规则重新编译生成它
2.3) 目标.o文件存在,目标.o文件比它的任何一个依赖文件的(c源文件、.h文件)"更新"(它的依赖文件在上一次make之后没有被修改),则什么也不做
) 可执行文件
对于Makefile的工作流程的理解,我们一定要牢记递归的概念,即make会将终极目标的依赖目标从右到左一次回退全部执行完,出现在"终极目标"的依赖列表中的目标一定要全部执行完之后,终极目标才能被最终完成 . 如果在处理终极目标的依赖目标的时候,又出现了新的依赖目标,则继续递归地进行处理(类似函数栈调用原理) . . 在Makefile中一个规则的目标如果不是"终极目标"所依赖的(或者"终极目标"的依赖文件所依赖的),那么这个规则将不会被执行,除非明确指定执行这个规则(可以通过make的命令行指定重建目标,那么这个目标所在的规则就会
被执行,例如"make clean") . 更新(或者创建)终极目标的过程中,如果任何一个规则执行出现错误make就立即报错并退出。
整个过程make只是负责执行规则,而对具体规则所描述的依赖关系的正确性、规则所定义的命令的正确性不做任何判断。
就是说,一个规则的依赖关系是否正确、描述重建目标的规则命令行是否正确,make不做任何错误检查。
因此,需要正确的编译一个工程。需要在提供给make程序的Makefile中来保证其依赖关系的正确性、和执行命令的正确性。

0x3: Example

edit : main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o /*注释:如果后面这些.o文件比edit可执行文件新,那么才会去执行下面这句命令*/
cc -o edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc -c command.c
display.o : display.c defs.h buffer.h
cc -c display.c
insert.o : insert.c defs.h buffer.h
cc -c insert.c
search.o : search.c defs.h buffer.h
cc -c search.c
files.o : files.c defs.h buffer.h command.h
cc -c files.c
utils.o : utils.c defs.h
cc -c utils.c
clean :
rm edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o

Relevant Link:

http://wiki.ubuntu.org.cn/%E8%B7%9F%E6%88%91%E4%B8%80%E8%B5%B7%E5%86%99Makefile:MakeFile%E4%BB%8B%E7%BB%8D#.E4.B8.80.E4.B8.AA.E7.A4.BA.E4.BE.8B

6. Makefile Example

hellomake.c hellofunc.c hellomake.h
#include <hellomake.h>

int main() {
// call a function in another file
myPrintHelloMake(); return(0);
}
#include <stdio.h>
#include <hellomake.h> void myPrintHelloMake(void) { printf("Hello makefiles!\n"); return;
}
/*
example include file
*/ void myPrintHelloMake(void);

0x1: Makefile 1

hellomake: hellomake.c hellofunc.c
gcc -o hellomake hellomake.c hellofunc.c -I.

0x2: Makefile 2

CC=gcc
CFLAGS=-I. hellomake: hellomake.o hellofunc.o
$(CC) -o hellomake hellomake.o hellofunc.o -I.

0x3: Makefile 3

CC=gcc
CFLAGS=-I.
DEPS = hellomake.h %.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS) hellomake: hellomake.o hellofunc.o
gcc -o hellomake hellomake.o hellofunc.o -I.

0x4: Makefile 4

CC=gcc
CFLAGS=-I.
DEPS = hellomake.h
OBJ = hellomake.o hellofunc.o %.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS) hellomake: $(OBJ)
gcc -o $@ $^ $(CFLAGS)

0x5: Makefile 5

IDIR =../include
CC=gcc
CFLAGS=-I$(IDIR) ODIR=obj
LDIR =../lib LIBS=-lm _DEPS = hellomake.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS)) _OBJ = hellomake.o hellofunc.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ)) $(ODIR)/%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS) hellomake: $(OBJ)
gcc -o $@ $^ $(CFLAGS) $(LIBS) .PHONY: clean clean:
rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~

Relevant Link:

http://www.cs.colby.edu/maxwell/courses/tutorials/maketutor/

 

Copyright (c) 2014 LittleHann All rights reserved

GCC、Makefile编程学习的更多相关文章

  1. linux编程学习

    linux编程学习 工具篇 “公欲善其事,必先利其器”.编程是一门实践性很强的工作,在你以后的学习或工作中,你将常常会与以下工具打交道, 下面列出学习 C 语言编程常常用到的软件和工具. (一)操作系 ...

  2. Makefile的学习笔记

    Makefile的学习笔记 标签: makefilewildcard扩展includeshellfile 2012-01-03 00:07 9586人阅读 评论(2) 收藏 举报  分类: Linux ...

  3. 运用Autoconf和Automake生成Makefile的学习之路

    作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由软件惯例的M ...

  4. Makefile基础学习

    Makefile基础学习 理论知识 makefile关系到了整个工程的编译规则.一个工程中的源文件不计其数,并且按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文 ...

  5. C语言/C++对编程学习的重要性!

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  6. Linux简单编程学习心得

    在Linux环境下简单编程学习心得 linux编程过程 在上周的<信息安全设计基础>的课程学习中学习到了在虚拟的linux环境下简单的编程.学习过程中接触到了vim.gcc和gcd在实验楼 ...

  7. 【编程学习笔记】如何组织构建多文件 C 语言程序!编程也有~

    优秀 Unix 程序哲学 首先,你要知道这个 C 程序是一个 Unix 命令行工具.这意味着它运行在(或者可被移植到)那些提供 Unix C 运行环境的操作系统中.当贝尔实验室发明 Unix 后,它从 ...

  8. 【C语言C++编程学习笔记】一种很酷的 C 语言技巧,灵活运用编程技巧让你写代码事半功倍!

    C语言常常让人觉得它所能表达的东西非常有限.它不具有类似第一级函数和模式匹配这样的高级功能.但是C非常简单,并且仍然有一些非常有用的语法技巧和功能,只是没有多少人知道罢了. ☆ 指定的初始化 很多人都 ...

  9. 【嵌入式】C语言高级编程▁▁▁嵌入式C语言入门编程学习!

    ✍  1.C 语言标准 什么是 C 语言标准呢? 我们生活的现实世界,就是由各种标准构成的,正是这些标准,我们的社会才会有条不紊的运行. 比如我们过马路,遵循的交通规则就是一个标准:红灯停,绿灯行,黄 ...

随机推荐

  1. java 21 - 2 字符输出流

    字符输出流:OutputStreamWriter 构造方法:一共4个,说2个常用的 A:OutputStreamWriter(OutputStream out):根据默认编码把字节流的数据转换为字符流 ...

  2. Enabling CORS in WCF

    Introduction This is an intermediate example of WCF as REST based solution and enabling CORS access, ...

  3. Android Touch事件传递机制解析 (推荐)

    最近新闻列表里的下拉 down up  move 等等让我十分头疼 ,无意间看到了一篇非常不错的帖子,转载如下: 开篇语:最近程序在做一个小效果,要用到touch,结果整得云里面雾里的,干脆就好好把a ...

  4. 学习Shell脚本编程(第2期)_编写修改权限及执行Shell程序的步骤

    编写Shell程序 执行Shell程序 Shell程序有很多类似C语言和其他程序设计语言的特征,但是又没有程序语言那样复杂.Shell程序是指放在一个文件中的一系列Linux命令和实用程序.在执行的时 ...

  5. 解决vs2013使用Git推送到远程仓库报错的问题

    在上一篇<让PowerShell使用Git>中可以让PowerShell运行Git命令,那么就开始使用. 1.从远程仓库克隆项目 GitHub和Git.oschina都是不错的免费托管网站 ...

  6. NetBios网络基础及编程

    开始学习(算是复习)网络编程了,第一个就是局域网的netbios协议编程. 首先了解一下什么是netbios:IBM公司为PC-Network开发的一套网络标准.,NetBIOS最广泛的应用之一就是对 ...

  7. 工作随笔——CentOS6.4支持rz sz操作

    yum一句话解决: yum -y install lrzsz

  8. typeof和instanceof简介及用法

    typeof 使用方式:typeof a 或者 typeof (a) 返回一个string类型的值 顾名思义,这货是检查类型的,输出的是一个string值,直接看下面的检测代码: console.lo ...

  9. 如何自学 Android 编程?

    最近知乎上有网友问我怎么自学Android,其实说实在的,我学的也一塌糊涂,当然在学习过程也积累了一些知识,对于以前没接触过Android的朋友,或者刚入门Android 的朋友,这篇文章作为入门,那 ...

  10. Unity3D 的摄像机

    什么是摄像机 Unity3D中,摄像机是一个非常非常重要的组件. 他的作用就是:将你设计的场景投影到设备的屏幕上. 摄像机的属性 1 clear flags 确定屏幕的哪一部分将被清除. 每个摄像机在 ...