• 程序中引入库文件的头文件 编译时并不需要显示的用gcc去链接他的库文件 why?


    拿一个苹果系统下的c文件为例:

    testArr.c
      1 #include <stdio.h>
      2 
      3 int main()
      4 {
      5         int a[] = {1, 2, 3, 4, 5};
      6         printf("%d
    ", a[3]);
      7 }

    当我们编译的时候  一般使用 gcc testArray.c 编译出来一个名为a.out的可执行文件,但是文件中我们引入

    了<stdio.h>,为什么不需要显示的用gcc去链接这个库文件呢?原来当用gcc编译的时候会调用ld去链接库

    文件,先把testArray.c编译成一个目标文件,再用ld命令去链接,看看发生了生么。

    首先

    gcc -c testArr.c

    会生成一个testArr.o的目标文件

    接下来进行目标文件的链接

    ld testArr.o

    会出现错误信息:

    1 ld: warning: -macosx_version_min not specified, assuming 10.7
    2 Undefined symbols for architecture x86_64:
    3   "_printf", referenced from:
    4       _main in testArr.o
    5   "start", referenced from:
    6      implicit entry/start for main executable
    7 ld: symbol(s) not found for inferred architecture x86_64

    提示的错误信息表示目标文件在链接的时候没有找到main函数中的printf函数,printf函数是库文件中的函数,所以连接器没有找到库文件进行链接。

    这时候我们需要显示的让它链接库文件

    ld testArr.o -lc

    但还是会出一些提示信息

    1 ld: warning: -macosx_version_min not specified, assuming 10.7
    2 Undefined symbols for architecture x86_64:
    3   "start", referenced from:
    4      implicit entry/start for main executable
    5 ld: symbol(s) not found for inferred architecture x86_64

    我们会发现系统提示没有找到系统的start入口,接下来

    ld testArr.o -lc  -macosx_version_min 10.8

    会发现终于没有错误和警告信息了。

    结论:使用gcc不需要显示的链接是因为内部编译器自动的干了这些事情,当我们自己一步步来做这些事情的时候,就会发现该有的步骤还是会有。

    终于明白,“喜欢”是一种莫大的能量!
  • 相关阅读:
    bzoj1037: [ZJOI2008]生日聚会Party(DP)
    bzoj1034: [ZJOI2008]泡泡堂BNB(贪心)
    bzoj1025: [SCOI2009]游戏(数学 + 思维 + DP)
    第十章、嵌入式Linux的调试技术 读书笔记
    第九章、硬件抽象层:HAL 读书笔记
    第八章 让开发板发出声音:蜂鸣器驱动
    ANDROID深度探索(卷1)HAL与驱动开发 第七章
    ANDROID深度探索(卷1)HAL与驱动开发 第六章
    ANDROID深度探索(卷1)HAL与驱动开发 第五章
    ANDROID深度探索(卷1)HAL与驱动开发 第四章
  • 原文地址:https://www.cnblogs.com/tml839720759/p/3174894.html
Copyright © 2020-2023  润新知