HelloWorld背后没那么简单

it2023-02-12  44

在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 静态库    
最新回复(0)