HelloWorld背后没那么简单

主要参考百问网科技: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 代码截图

|[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dneUySzD-1624003854383)(pic/hello.png)]

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 静态库。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值