论第三方库的使用 C++与C中编译与链接 Windows平台下

news/2024/12/23 4:18:37/文章来源:https://www.cnblogs.com/Sonud-One/p/18622872

似乎每个人使用C++三方库都会遇到苦难,但本质其实很简单,只需要理解链接过程到底发生了什么。对任何概念和术语不完全清楚,都可以求助大语言模型。

众所周知,编译和链接是两个过程,同一个标识符可以多次声明,但只能有一个实现。编译只需要声明,链接时才会检查实现。
函数重载不是同一个标识符吗?答案是每一个重载函数确实有一个唯一的标识符,函数重载会在编译时重整化,每一个重载函数生成一个唯一的内部名称

 

std::cout << "hello" << std::endl;

这是一条语句将其改写为一个函数

void hello(){std::cout << "hello" << std::endl;}

hello();
声明并定义后在代码中像这样即可调用hello函数了

 

要在多个文件中使用hello函数该怎么做,记住声明可以多次,但只能有一个定义
自然,是在一个源文件中定义,在其他源文件中只声明,或者使用头文件

在头文件 hello.h 中声明hello函数,严格来说是一个无参数无返回值的hello函数
void hello()

通常地,hello.cpp中编写实现,但记住,这只是一个惯例,定义可以在任何源文件,但只能定义一次
void hello(){std::cout << "hello" << std::endl;}


#include "hello.h"
相当于将
void hello();
粘贴到文件中,hello函数声明后就可以使用函数了

要在多个项目中使用hello函数怎么做?可以将头文件和源文件复制到每一个项目中
或者将hello函数生成为库,这样每个项目只需要头文件获取声明和一个编译完成的库文件获取定义了
为什么?因为使用库只需要声明,在源代码中包含库的源文件只会造成混乱,如果不做修改,没有必要关心这些声明的具体定义,使用这些库只需要头文件,在源文件中引入头文件,声明标识符之后就可以使用了。

同样地,使用三方库需要引入头文件获取声明,实现在哪里?lib或DLL,取决于静态链接还是动态链接
当然可以将所有需要的头文件复制到项目目录下并包含于项目中,也可以使用完整路径或相对路径引入头文件
有什么方法能让这些头文件像标准库头文件一样引入呢?这就是附加包含目录的作用
你可以告诉IDE,附加包含目录的目录下,有项目需要的头文件,使用include 指令时请检查这些目录。

链接器怎么知道lib或DLL文件在哪里?
答案是不知道,当然通常会有一个默认路径,其中包含了系统和标准库相关的库,这也被称之为环境变量。
你需要告诉链接器你的库文件在哪里,准确地说是哪个路径下,这就是附加库目录的作用,

既然已经知道了目录,那为什么又需要附加依赖项呢?
答案是因为附加库目录下可能有多个库文件,链接器需要知道要链接哪些库文件。现实是不能像其他语言按需自动识别,自动链接对应库文件。

在 VS2022 中使用静态库时,需要同时设置附加库目录和附加依赖项,这两个设置有着不同的作用和目的:
附加库目录
• 作用与原理:附加库目录用于告诉编译器和链接器去哪里查找静态库文件(.lib文件)。它类似于设置一个搜索路径,当链接器在寻找所需的静态库时,会在该目录下进行搜索。但它并不完全等同于设置环境变量让链接器搜索指定lib文件。虽然设置环境变量也可以让链接器找到库文件,但这种方式可能会影响整个系统的环境,而且不够灵活和项目特定化。而在 VS2022 中通过设置附加库目录,可以针对每个项目进行独立的配置,更方便管理和维护。
• 示例:如果你的静态库文件位于项目目录下的libs文件夹中,你就需要将该libs文件夹的路径添加到附加库目录中,这样链接器才能找到对应的.lib文件。
附加依赖项
• 作用与原理:附加依赖项则是明确指定项目所依赖的静态库文件名。它的作用是告诉链接器在链接过程中需要将哪些具体的静态库文件链接到可执行文件中。可以理解为指定链接参数的一部分,它具体指定了要链接的库文件的名称,而不仅仅是库文件所在的目录。
• 示例:如果你的项目依赖于mylib.lib和anotherlib.lib这两个静态库,你就需要在附加依赖项中分别添加这两个库的文件名。这样链接器在链接时就会将这两个库文件中的代码和数据与你的项目代码进行合并,生成最终的可执行文件。

std::cout << "hello" << std::endl;

这是一条语句,cout endl 在头文件iostream中声明
#include <iostream> 本质上就是复制粘贴
因此源文件获得了cout endl 的声明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/857246.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用ollama+llama3.1+open-webui搭一个本地的模型

1、先安装我们的ollama 1.1、官网地址:https://ollama.com/ 选择合适的版本,我的是window版本,点击下载,不用填邮箱。1.2、开始安装,选择默认就可以1.3、安装完毕:cmd输入:ollama2、安装模型:llama3.1 2.1:找到模型 2.2复制下载2.3、命令行下载: 2.4、下载完毕就进入对…

windows修改mac 地址

参考 https://blog.csdn.net/u012559967/article/details/134768073 win11确认可行 (另外一种修改注册表,暂未确认) 网络适配器中配置 网络适配器中配置的方式适用于能够在网络适配器中找到物理地址(NetworkAddress)的情况。 1、打开控制面板 > 网络和共享中心 > 更改…

MADDPG算法

MADDPG算法 论文名称:《Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments》 一、基本问题 MADDPG是一篇经典的多智能体强化学习算法。在MADDPG以前,多智能体强化学习算法主要为独立学习技术。独立学习技术 独立学习技术就是在环境中对于每一个智能体…

ble广播和连接

蓝牙BLE设备的状态:从机处于待机,广播,连接状态中的一种,主机处于待机,扫描,连接状态的一种。 在BLE通讯中,数据收发都是通过连接事件触发的。连接事件的发生始终位于一个频率,这个频率由连接参数决定。连接参数是主机决定的,从机可以向主机发起连接参数请求,但是最终…

ble基础

一、蓝牙基础 蓝牙标准profile bluez linux tools 一文读懂BLE 1.1 蓝牙分类 蓝牙分为经典蓝牙(BT-Bluetooth)和低功耗蓝牙(BLE-Bluetooth Low Energy)。这两套原理和实现都不一样,也无法实现互通。 Basic Rate(BR)/EDR/AMP 最初的蓝牙技术,包括可选的EDR(Enhanced Da…

爬取小说案例-BeautifulSoup教学篇

@目录前言导航BeautifulSoupBeautifulSoup介绍BeautifulSoup的使用1. 导入库2. 实例化对象3. 提取数据成果共勉博客 前言 当我们进行爬取各种资源,拿到源码进行解析数据的时候,会用到各种解析方式,本文介绍的爬取小说的一个案例,使用比较受欢迎的python第三方库BeautifuSou…

vue基础指令示例

1、vue基础示例<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>基础指令</title><script src="../vu/js/vue.js"></script><style>.box1{width: 150px;height: 1…

楚慧杯Misc—复现

gza_CrackerCrack_me 追踪tcp流量找到字典保存字典,上流量一把梭base64解密特殊流量2 一把梭出个www.zip打开,是个RSA <?php $cmd = @$_POST[ant]; $pk = <<<EOF -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCfhiyoPdM6svJZ+QlYywklwVcx…

INFINI Labs 产品更新 | Console/Gateway/Agent 等产品开源发布首个版本

INFINI Labs 产品又更新啦~,包括 Easysearch v1.9.0、Gateway、Console、Agent、Loadgen v1.27.0。本次各产品更新了很多亮点功能,如 Easysearch 优化了多版本兼容配置;Console/Gateway/Agent/Loadgen 及 Framework 开源后,发布首个重大更新版本,支持过期元数据删除,指标…

JVM简介—1.Java内存区域

大纲 1.运行时数据区的介绍 2.运行时数据区各区域的作用 3.各个版本内存区域的变化 4.直接内存的使用和作用 5.站在线程的角度看Java内存区域 6.深入分析堆和栈的区别 7.方法的出入栈和栈上分配、逃逸分析及TLAB 8.虚拟机中的对象创建步骤 9.对象的内存布局 10.对象的访问定位 …

鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】

鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析 万物智联,打造无缝智能生态 在科技不断迭代更新的今天,每一次技术的飞跃都是对未来的深刻探索。华为,这个始终站在科技前沿的企业,再次以HarmonyOS 5.0(Next)这一操作系统的新篇章,向我们展示了科技如…