【问题标题】:where does stdio.o live in linux machine?stdio.o 住在 linux 机器的什么地方?
【发布时间】:2014-12-08 06:02:17
【问题描述】:

我正在尝试手动执行程序的所有编译步骤。在我使用链接器命令 ld 的最后一步中,我需要为库指定目标文件(stdio,因为我在代码中使用了 printf)然后只有我可以制作和 .exe 文件。这个目标文件在哪里?

【问题讨论】:

    标签: c linux


    【解决方案1】:

    我建议你运行gcc -v your_file.c。这将让您确切地看到您的链接器正在使用哪些命令。您可能没有要链接的 stdio.o 文件。相反,它包含在 C 运行时库中,具体文件取决于您的系统配置。

    【讨论】:

      【解决方案2】:

      stdio 是 C 标准库的一部分。标准库的确切位置因系统而异,但通常位于名为 libc.a 或 libc.so 的文件中。

      在我的机器上可以找到:

      /usr/lib/x86_64-linux-gnu/libc.a
      /usr/lib/x86_64-linux-gnu/libc.so
      

      您可以向ld询问搜索目录:ld --verbose | grep SEARCH_DIR

      libc.a 是一个ar (man) 存档,您可以使用ar 命令从libc.a 存档中提取stdio.o

      $ # list archive member with `ar t`
      $ ar t /usr/lib/x86_64-linux-gnu/libc.a | grep ^stdio
      stdio.o
      $ # extract stdio.o with `ar x`
      $ ar x /usr/lib/x86_64-linux-gnu/libc.a stdio.o
      

      【讨论】:

      • 是的,stdio.h 和 stdio.o 没有区别,只是有 pragma 设置说它是一个 gnu 库。但是 .h 文件有一些空函数声明。我猜他是在问带有完整函数声明的文件在哪里。
      • @user135142 .h 和 .o 不是一回事,两者之间有很大的区别。 .h 是头文件,编译器在编译阶段使用它; .o 是一个目标文件,它包含库的编译代码,并在链接阶段由链接器使用。除非您明确单独下载它,否则定义 stdio 的完整源代码通常不会安装在您的机器中。您必须从您的发行版或 GNU 的源代码库中获取它。
      • 我听说那些 .o 文件是静态的并且在编译时加载。我认为我们需要查看 gcc 的来源才能查看它们。
      • 是的,.o 文件中的已编译对象由链接器静态链接,换句话说,它们在编译后复制到可执行文件中。大多数C编译器在编译后会自动调用链接器,所以很多人不需要知道编译正确和链接实际上是编译过程中的两个独立阶段。但是是的,.o 文件不包含源代码,它们毕竟是经过编译的。
      【解决方案3】:

      它可能在根目录下

      类似/usr/lib/usr/lib***

      【讨论】:

      • 我不确定.. 但肯定在/usr
      • 不一定正确 - 仅仅因为问题表明 OP 可能没有编译他自己的 stdio,并不意味着系统管理员没有将它放在其他地方。放置在 /lib{,32,64} 中对于正常的 ld-config 设置不会造成太大的破坏,并且通过调整路径,它可以很容易地放在系统管理员想要的任何地方(尽管看起来像 /temp 这样的地方是一种浪费的好方法你的时间!:))
      • @chrisb2244 也不清楚(对我来说)OP 实际上已经编译了 stdio。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-20
      • 2016-04-02
      • 2014-04-17
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      相关资源
      最近更新 更多