C++链接器工作原理详解

 更新时间:2024年02月11日 09:46:01   作者:我叫大健  
当文件见过编译后就需要进行一个链接的操作接下来我们就说说什么是链接,本文给大家介绍了C++链接器是如何工作的,文章通过代码示例和图文介绍的非常详细,需要的朋友可以参考下

当文件见过编译后就需要进行一个链接的操作接下来我们就说说什么是链接

接下来我展示一些例子:

#include<iostream>
 
void Log(const char* message)
{
	std::cout << message << std::endl;
}
 
int Multiply(int a, int b)
{
	Log("Multiply");
	return a * b;
}

这是一段非常简单的代码,它有一个Log函数和一个Multiply函数其中Multiply调用了Log函数然后返回a*b的值。发现没用它没有主函数main,所以他其实并不是一个完整的程序,首先我们要意思到,编译是两个阶段的编译个链接,接下来哦我们用这段代码来展示一下他们的区别。

这段代码复制到vs中,如果我们按ctrl+F7可以发现这段代码他是不报啥错的,一切是正常的,以为编译生成了obj目标文件。

那么如果我们是右键生成,可以发现会有一个LNK的报错,这个就是链接错误。

那怎么解决这个错误呢?我们添加一个main函数就可以了(因为我们缺少了入口函数)

接着我们把这段代码补全,然后运行一下,可以看到代码是可以正确运行的。

我们假设有很多的cpp文件,所以就需要一个log日志文件,把log函数放到log.ccpp中,然后运行一下,可以看到成功编译了。

接下来,我看看一个非常有意思的错误,改成下面这段代码.

log.cpp
#include<iostream>
 
void Logr(const char* message)
{
	std::cout << message << std::endl;
}
 
 
 
Multiply.cpp
#include<iostream>
 
void Log(const char* message);
int Multiply(int a, int b)
{
	//Log("Multiply");
	return a * b;
}
 
int main()
{
	std::cout << Multiply(8, 5) << std::endl;
	std::cin.get();
}

这样我们一看就知道这段代码是可以正常编译的,因为我们把log函数注释了,但是如果我们是注释的Multiply这个调用的?你们猜猜这个还可以正常编译吗?看看结果,没错他报错了(链接错误),按正常来说我们注释了Multiply这个调用,那log不是也就没用到(log在Multiply函数中),那应该是对的才对啊!并不是这样的,因为在文件汇中,虽然我们没用用到Multiply函数,但是从技术上来说我们是可能在其他地方用到他的,所以连接器就需要链接他就会报错(因为找不到嘛),那么只要告诉链接器,Multiply不会再其他地方用到只会再这个里面用到就可以解决这个问题了,怎么解决呢?加一个static(这意味着Multiply函数只声明在Multiply.cpp中),我们试试。好了,不报错了,很神奇吧!总的来说就是如果编译器找不到确切的函数定义,就会有链接错误

以上就是C++链接器工作原理详解的详细内容,更多关于C++链接器工作原理的资料请关注脚本之家其它相关文章!

相关文章

  • C++实现视频流转换为图片方式

    C++实现视频流转换为图片方式

    今天小编就为大家分享一篇C++实现视频流转换为图片方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • C语言实现将字符串转换为数字的方法

    C语言实现将字符串转换为数字的方法

    这篇文章主要介绍了C语言实现将字符串转换为数字的方法,涉及系统函数atoi()函数的使用技巧,需要的朋友可以参考下
    2014-12-12
  • C++命名空间域的实现示例

    C++命名空间域的实现示例

    命名空间域就是一个独立的空间外面不能直接调用该空间域只能用访问限定符指定访问该空间域,本文主要介绍了C++命名空间域的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • C++深入探究list的模拟实现

    C++深入探究list的模拟实现

    list相较于vector来说会显得复杂,它的好处是在任意位置插入,删除都是一个O(1)的时间复杂度,本文主要介绍了C++中List的模拟实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Qt实现配置文件读写操作的示例详解

    Qt实现配置文件读写操作的示例详解

    这篇文章主要为大家详细介绍了如何使用Qt实现配置文件读写操作,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-05-05
  • C语言数据的存储超详细讲解下篇浮点型在内存中的存取

    C语言数据的存储超详细讲解下篇浮点型在内存中的存取

    使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。您可能需要存储各种数据类型的信息,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么
    2022-04-04
  • 深入理解C++内链接与外链接的意义

    深入理解C++内链接与外链接的意义

    链接描述了名称在整个程序或一个翻译单元中如何引用或不引用同一实体,下面这篇文章主要给大家介绍了关于C++内链接与外链接意义的理解,需要的朋友可以参考下
    2021-11-11
  • VS2022配置编译使用boost库的实现

    VS2022配置编译使用boost库的实现

    本文介绍了如何在VS2022中配置和编译使用Boost库的步骤,包括下载Boost、解压、配置环境变量和编译等过程,具有一定的参考价值,感兴趣的可以了解一下
    2024-12-12
  • 基于C语言实现学生选课系统

    基于C语言实现学生选课系统

    这篇文章主要为大家详细介绍了基于C语言实现学生选课系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • 简单掌握C++中的函数模板

    简单掌握C++中的函数模板

    这篇文章主要介绍了C++中的函数模板,包括函数模板的声明和生成以及异常处理等基本知识,需要的朋友可以参考下
    2016-04-04

最新评论