1.理解C语言代码编译流程
预处理
预处理处理宏定义和头文件,源文件中包含的头文件会在源文件里展开。源文件主要是需要头文件中的外部变量和函数的声明,这样源文件在后面的链接时才知道需要去库文件或者外部的目标文件中寻找。编译器会进行优化,如果源文件中没有用到的变量和函数声明生成目标文件的时候是没有的,所以包含多个头文件是不影响文件大小的。所以这里报错的话一般是头文件找不到导致include无法展开出现了等错误。
编译和汇编
C语言的源文件被编译成汇编文件,汇编文件在生成二进制文件,这个过程一般没有C语言语法错误是不会报错的。
链接
编译和汇编完成后的多个目标文件链接成最后的obj文件,然后这个obj文件会被下载到单片机的flash中。这个过程经常出现的错误是符号未定义,例如utils.c中定义了func()函数,main.c中include了utils.h并且调用了func()函数,但是如果链接的时候没有链接这个utils.c函数,那么链接器在当前所有的目标文件的符号表中都无法找到这个func()的定义位置,那么链接器就会报错。
2.常见编译错误
头文件未找到
配置工程属性,在ARM Compiler–>include Options选项的Add dir #include search path中添加头文件查找的路径。
符号未定义
包含了头文件只是包含了外部函数的声明,在预处理和编译、汇编阶段不会报错,但是在链接时会出现符号未定义的错误,因为没有找到函数的定义。
配置工程属性,在ARM Linker–>File Search Path选项的Include library file or command file as input中添加单个库文件的路径及路径名。也可以在Include library file or command file as input直接添加库的名字,然后在下面的Add dir to library search path中添加库文件的路径
添加源文件
有些代码是没有被编译进库文件中的,例如uartstdio.c,需要手动添加这个源文件。不是在文件夹中将这个文件拷贝到文件目录,而是要在工程选项中使用Add Files,这个编译器才知道要将哪些源文件编译成一个可执行文件。