在Ubuntu上编译执行HelloWorld程序
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;
}
执行命令编译
book@www.100ask.org:~/work/learnC$ gcc -o hello hello.c
book@www.100ask.org:~/work/learnC$ ./hello
Hello, world!
book@www.100ask.org:~/work/learnC$ ./hello wt
Hello, wt!
book@www.100ask.org:~/work/learnC$ 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
book@www.100ask.org:~/work/learnC$
这里使用的是gcc编译命令,是PC机上的编译命令,所以hello只能在Ubuntu中运行。不能在我们的arm开发板上运行。使用file命令查看文件类型,是支持x86平台的,也就是PC机。
在arm板子上运行hello程序
使用交叉编译工具链编译
book@www.100ask.org:~/work/learnC$ arm-linux-gcc -o hello hello.c
book@www.100ask.org:~/work/learnC$ ./hello
bash: ./hello: cannot execute binary file: Exec format error
book@www.100ask.org:~/work/learnC$ file hello
hello: ELF 32-bit LSB executable, ARM, version 1, dynamically linked, interpreter /lib/ld-, for GNU/Linux 2.4.3, not stripped
book@www.100ask.org:~/work/learnC$
使用的是交叉编译,生成的可执行文件在Ubuntu上看是报错,格式不对。file命令查看文件类型,是支持ARM平台,也就是嵌入式平台。
分析hello.c代码
代码截图
分析
(1)头文件有什么用?
声明(declare)告诉开发工作者和编译器怎么使用函数,头文件里面有函数名字、参数、返回值。
(2)c文件有什么作用?
定义/实现头文件里面的函数,里面有函数的实现过程。
(3)头文件在哪里?
① PC机上默认的路径是在/usr/include/x86_64-linux-gnu/bits/stdio.h
② ARM默认的路径是在交叉工具链里面。
③ <>包含头文件编译时会在默认的目录下找头文件。也可以说是系统头文件。
④ "" 会在当前目录下查找头文件。或者是指定的目录。
⑤ 编译时加上 -I 参数指定头文件目录,会先到这个目录下去找头文件,再到默认的目录去找
(4)printf函数在哪里?
① 在库里面
PC机是在/lib/ 、/usr/lib
交叉编译器默认路径是在编译器中的lib目录下
② 别的C文件里,可以字节构造printf函数
③ -L 指定库目录
④ -l指定库 l和库名字之间没有空格
举例
(1)命令
gcc -o hello hello.c
-I ../driver
s
_and_test/
-L /usr/lib/
-llibmenu
(2)
-I ../drivers_and_test/:指定这个目录为第一个查找头文件的目录
(3)
-L /usr/lib/:指定这个目录是第一个查找库文件的目录
(4)
-llibmenu:表示在上面的lib路径下寻找
libmenu.so动态库 如果编译选项夹入了
-static 表示寻找的是
libmenu.a 静态库