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

linux链接编译详解

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

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("testn");
}

编译后执行

输出: 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("%cn",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

免责声明:

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

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

linux链接编译详解

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

下载Word文档

猜你喜欢

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链接编译

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

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

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

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

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

Linux链接命令的实例详解

Linux链接命令的实例详解 一 语法ln -s [源文件] [目标文件] 命令英文含义:link 功能描述:生成链接文件 选项:-s 创建软链接 二 硬链接特征原文件和硬链接文件删除其中任何一个都没问题。三 硬链接实战[root@loca
2022-06-04

linux 编译安装python3.6的教程详解

1. 首先去官网 https://www.python.org/downloads/source/ 下载 Gzipped source tarball不要下载 " XZ compressed source ta
2022-06-04

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

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

ubuntu16.04 linux 编译安装apache2.4.33的教程详解

下载软件包:wget http://mirror.bit.edu.cn/apache//httpd/httpd-2.4.33.tar.gz wget http://mirrors.tuna.tsinghua.edu.cn/apache//a
2022-06-04

Linux下软链接和硬链接的创建、删除、区别详解

在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号。文件属性保存在索引结点里,在访问文件时,索引结点被复制到内存里,从而实现对文件的快速访问。 链接是一种在共享文件和访问它的用户的
2022-06-03

Golang编译过程详解

Golang编译过程详解Golang(也称为Go)是一种由Google开发的编程语言,它具有简洁、高效、并发等特点,因此受到了广泛的关注和应用。在使用Golang进行编程时,编译是一个非常重要的环节,本文将详细介绍Golang的编译过程,
Golang编译过程详解
2024-03-07

Linux环境下, 源码编译安装详解 (编译CMake 3.15 和 gcc 5.3.0 为例)

一. 源码编译安装详解 (待补充)二. 安装CMake 3.151. 查看操作系统版本[root@mysql80 local]# cat /etc/redhat-releaseCentOS Linux release 7.4.1708 (C
2023-06-05

Linux反编译与软件逆向工程工具链

在Linux下进行软件逆向工程和反编译通常需要使用一系列工具来辅助完成。以下是一些常用的Linux反编译和软件逆向工程工具链:IDA Pro:IDA Pro是一款专业的反编译工具,支持多种架构和文件格式,可以用来进行静态分析和反汇编。Rad
Linux反编译与软件逆向工程工具链
2024-08-22

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

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

编程热搜

目录