主要参考百问网科技:http://wiki.100ask.org/
1 在Ubuntu上编译执行HelloWorld程序
1.1 hello.c源码
#include <stdio.h>
/* 执行命令: ./hello weidongshan
* argc = 2
* argv[0] = ./hello
* argv[1] = weidongshan
*/
int main(int argc, char **argv)
{
if (argc >= 2)
printf("Hello, %s!\n", argv[1]);
else
printf("Hello, world!\n");
return 0;
}
1.2 执行命令编译
# 1.编译执行
$ gcc -o hello hello.c
$ ./hello
Hello, world!
# 2.执行
$ ./hello wt
Hello, wt!
# 3.查看文件类型
$ file hello
hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 2.6.32, BuildID[sha1]=d5e79a0a04b6cadd3272cd37627d4d7147b89f96, not stripped
这里使用的是 gcc
编译命令,是 PC
机上的编译命令,所以 hello
只能在 Ubuntu
中运行。不能在 arm
开发板上运行。使用 file
命令查看文件类型,是支持 x86
平台的,也就是 PC
机。
2 在arm板子上运行hello程序
2.1 使用交叉编译工具链编译
# 1.编译执行
$ arm-linux-gcc -o hello hello.c
$ ./hello
bash: ./hello: cannot execute binary file: Exec format error
# 2.查看文件类型
$ file hello
hello: ELF 32-bit LSB executable, ARM, version 1, dynamically linked, interpreter /lib/ld-, for GNU/Linux 2.4.3, not stripped
交叉编译,生成的可执行文件在 Ubuntu
上看是报错,格式不对。file
命令查看文件类型,是支持 ARM
平台,也就是嵌入式平台。
3 分析hello.c代码
3.1 代码截图
3.2 分析
- 头文件有什么用?
声明(declare
)告诉开发工作者和编译器怎么使用函数,头文件里面有函数名字、参数、返回值。 C
文件有什么作用?
定义/实现头文件里面的函数,里面有函数的实现过程。- 头文件在哪里?
PC
机上默认的路径是在/usr/include/x86_64-linux-gnu/bits/stdio.h
。ARM
默认的路径是在交叉工具链里面。<>
包含头文件编译时会在默认的目录下找头文件。也可以说是系统头文件。""
会在当前目录下查找头文件。或者是指定的目录。- 编译时加上
-I
参数指定头文件目录,会先到这个目录下去找头文件,再到默认的目录去找。
printf
函数在哪里?- 在库里面:
PC机
是在/lib/
、/usr/lib/
目录下。- 交叉编译器默认路径是在编译器中的
lib
目录下。
- 别的
C
文件里,可以自己构造printf
函数。 -L
指定库目录。-l
指定库l
和库名字之间没有空格。
- 在库里面:
3.3 举例
-
命令
$ gcc -o hello hello.c -I ../drivers_and_test/ -L /usr/lib/ -lmenu
-
解释
-I ../drivers_and_test/
:指定这个目录为第一个查找头文件的目录。-L /usr/lib/
:指定这个目录是第一个查找库文件的目录。-lmenu
:表示在上面的lib路径下寻找libmenu.so
动态库 如果编译选项加入了-static
表示寻找的是libmenu.a
静态库。