我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何理解linux链接编译

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何理解linux链接编译

本篇内容主要讲解“如何理解linux链接编译”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解linux链接编译”吧!

为什么要包含头文件而不是.c文件

测试代码:

代码如下:

m.c文件:
#include"t.c"
int main()
{
test();
return 0;
}

编译:

代码如下:

gcc m.c -o m -Wall

In file included from m.c:1:0:
t.c: 在函数‘test'中:
t.c:3:2: 警告: 隐式声明函数‘putchar' [-Wimplicit-function-declaration]
编译通过,只有一个警告,生成了可执行文件m,运行它正常,输出一空格。

修改下t.c 文件:

代码如下:

#include<stdio.h>
void test()
{
       printf("test\n");
}

编译后执行

输出:    test

从这可看出,包含.c文件进去对程序并没造成什么影响,反而比包含.h文件来得直接方便,这里主要考虑到大型项目中,各文件直接的联系,如A.c文件中包好M.c文件,B.c 文件中包含M.c文件,而A.c文件又包含B.c文件,那么编译时就会报错,函数名重定义了。
#include<>与#include""的区别:

对于用角括号包含的头文件,gcc 首先查找-I选项指定的目录,然后查找系统的头文件目录(通常是/usr/include,在我的系统上还包括/usr/lib/gcc/i486-linux-gnu/4.3.2/include);而对于用引号包含的头文件,gcc 首先查找包含头文件的.c文件所在的目录,然后查找-I选项指定的目录,最后再查找系统的头文件目录。

 静态库

代码如下:


char stack[512];
int top = -1;

代码如下:


extern char stack[512];
extern int top;
void push(char c)
{
stack[++top] = c;
}

代码如下:


extern char stack[512];
extern int top;
char pop(void)
{
return stack[top--];
}

代码如下:


extern int top;
int is_empty(void)
{
return top == -1;
}

代码如下:


#ifndef STACK_H
#define STACK_H
extern void push(char);
extern char pop(void);
extern int is_empty(void);
#endif

代码如下:


#include <stdio.h>
#include "stack.h"
int main(void)
{
   push('a');
   char c = pop();
   printf("%c\n",c);
   return 0;
}

将如上5个.c文件和一个.h文件放在同目录下,在当前目录下新建一Makefile文件,使用Makefile是编译。

代码如下:

main:libstack.a main.o
       gcc -o main main.o -L. -lstack
libstack.a: stack.o push.o pop.o is_empty.o
       ar rs libstack.a  stack.o push.o pop.o is_empty.o
stack.o:
       gcc -o stack.o -c stack.c
push.o
       gcc -o push.o -c push.c
pop.o:
       gcc -o pop.o -c pop.c
is_empty:
       gcc -o is_empty.o -c is_empty.c
main.o:
       gcc -o main.o -c main.c

编译后执行./main
显示:a

反编译指令: 查看反编译后程序

代码如下:

objdump -d main

到此,相信大家对“如何理解linux链接编译”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何理解linux链接编译

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何理解linux链接编译

本篇内容主要讲解“如何理解linux链接编译”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解linux链接编译”吧!为什么要包含头文件而不是.c文件测试代码:代码如下:m.c文件:#inc
2023-06-09

linux链接编译详解

为什么要包含头文件而不是.c文件 测试代码:m.c文件:#include"t.c"int main(){test();return 0;}编译: gcc m.c -o m -WallIn file included from m.c:1:0
2022-06-04

解析Linux下C++编译和链接

目录编译原理问题一:头文件遮挡目标文件符号解析问题二:静态库顺序动态链接问题三:全局符号介入运行时加载动态库问题四:静态全局变量与动态库导致double free总结编译原理 将如下最简单的C++程序(main.cpp)编译成可执行目标程序
2022-06-03

Linux反编译中的动态链接库处理

在Linux中进行反编译时,如果遇到需要处理动态链接库(Dynamic Link Libraries,简称DLL)的情况,通常需要使用工具来处理动态链接库中的符号和函数。下面是一些常用的工具和方法:使用objdump命令查看动态链接库的符号
Linux反编译中的动态链接库处理
2024-08-22

如何理解Linux内核编译

这篇文章给大家介绍如何理解Linux内核编译,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、前言(仅供参考)linux内核该如何学习1、安装vmware虚拟机或者virtualbox,再安装发行版本linux2、ww
2023-06-15

如何分析C++中的编译与链接

如何分析C++中的编译与链接,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言:C++有个最大的特点,那便是编译型语言,相比于Python这种解释型语言,C++在编译阶段就
2023-06-21

如何理解C++编译器编译功能

如何理解C++编译器编译功能,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。下面深度讲解C++中的大规模C++编译器,C++编译器具有很强的复杂性,并且源程序的行数也是非常多
2023-06-17

如何解析Linux文件链接

今天给大家介绍一下如何解析Linux文件链接。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。在Linux系统中链接分为两种:软连接、硬链接,可以使用 ls -l
2023-06-28

linux下如何编译boost.python

这篇文章主要为大家展示了“linux下如何编译boost.python”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“linux下如何编译boost.python”这篇文章吧。最近项目使用c++操
2023-06-09

怎么理解Linux的硬链接与软链接

这篇“怎么理解Linux的硬链接与软链接”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么理解Linux的硬链接与软链接”文
2023-06-16

如何编译Linux内核

这篇文章给大家分享的是有关如何编译Linux内核的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在计算机世界里,内核kernel是处理硬件与一般系统之间通信的低阶软件low-level software。除过一些烧
2023-06-16

linux如何用gcc编译

在 Linux 上使用 GCC 编译程序非常简单。以下是一些基本步骤:1. 打开终端并进入你的代码所在的目录。2. 确保你已经安装了 GCC 编译器。你可以在终端输入 "gcc --version" 来检查是否已安装。3. 编写你的 C/C
2023-09-08

如何理解Linux系统下连接器ld链接顺序

本篇内容主要讲解“如何理解Linux系统下连接器ld链接顺序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解Linux系统下连接器ld链接顺序”吧!  原来ld对于链接一系列的库的顺序是很
2023-06-13

如何理解Ubuntu编译源码包

如何理解Ubuntu编译源码包,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。学习编译时,你可能会遇到Ubuntu编译问题,这里将介绍Ubuntu编译问题的解决方法,在这里拿
2023-06-17

linux编译器如何打开

在Linux系统中,打开编译器可以通过以下几种方式:命令行方式:在终端中输入编译器的可执行文件名,如gcc(C语言编译器)、g++(C++编译器)等。例如,输入gcc命令即可启动GCC编译器。集成开发环境(IDE):Linux系统中有多个供
linux编译器如何打开
2024-02-29

Linux硬链接与软链接原理及用法解析

在linux系统中有种文件是链接文件,可以为解决文件的共享使用。链接的方式可以分为两种,一种是硬链接(Hard Link),另一种是软链接或者也称为符号链接(Symbolic Link)。 硬链接概念硬链接(hard link, 也称链接)
2022-06-03

linux软链接如何创建

这篇“linux软链接如何创建”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“linux软链接如何创建”文章吧。在linux中
2023-07-02

Linux系统中如何编译boost

今天给大家介绍一下Linux系统中如何编译boost。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。Linux平台Boost的编译方法Boost就是Boost库
2023-06-28

编程热搜

目录