静态链接&&动态链接(C++基础)

静态链接

一般情况下使用第三方包都以二进制文件进行链接,并不是获取实际依赖库源代码自己编译。

静态链接库是在编译的时候发生的,编译一个静态库的时候,将其链接在可执行文件,也就是应用程序上,或者连接到一个动态库,有点像取出那个静态库的内容,将它放在其他二进制数据中,它实际在动态库中或者在可执行文件中,正因为这样,很多优化可以进行,因为编译器和链接器现在知道,静态链接时,实际进入应用程序的代码,一般为lib文件,而动态链接指加载时对dll文件进行连接,一般来说,静态链接更快,静态链接允许更多优化发生。

通过下载GLFW库是熟悉这一概念,首先在下载之前先明确一个概念:你选择32位或64位的包并不根据开发环境决定,而根据运行环境决定。

将文件下载本地解压后,由lib和include组成,目录格式如下:

选择合适的lib版本和include文件夹一块复制在项目文件夹目录下,观察lib文件夹内容,发现主要由lib文件和dll文件组成,其中dll.lib文件避免dll链接时候需要询问而存在,如果没有dll.lib文件,我们要通过函数名来访问dll文件内的函数,但是lib文件已经包含所有函数的名字,已经链接上它们,一般lib文件要比dll文件大得多:

在这里配置附加包含目录,要记得勾选配置和平台,$(SolutionDir)是一个宏,在附加包含目录里可以查看更多的宏,在调用宏之后不用加\,因为宏本身结尾就有\

现在就可以使用include文件夹下的.h文件 。

#include<iostream>
#include"GLFW/glfw3.h"
int main() {
	int a = glfwInit();
	std::cin.get();
}

编译程序就会出现错误:

说明并没有将库文件链接到这里,通过下面的做通过链接器获得到lib文件。

//#include"GLFW/glfw3.h"
extern "C" int glfwInit();
int main() {
	int a = glfwInit();
	std::cout << a << std::endl;
	std::cin.get();
}

这下通过注释的代码和下面的语句都可以将a成功输出。第二条语句的含义是,glfw是C语言库,我们在这里用C++,混淆了名字,需要在前面加上extern "C"可以链接上C语言建立的库。

在C++中,使用<>""来引入头文件存在一些区别:

  • 当使用#include <xxx.h>格式时,编译器首先会在系统头文件目录中查找xxx.h,这是标准库头文件的常用方式。这种方式通常用于包含C++标准库或者系统提供的头文件。
  • #include "xxx.h"格式则首先在当前源文件的目录中查找xxx.h,如果找不到,再按照<>的方式进行查找。这通常用于包含用户自定义的头文件或者项目特定的头文件,因为这样可以使编译器更快地定位到这些头文件。

总的来说,<>主要用于包含系统或标准库的头文件,而""则更适合包含项目特定或用户自定义的头文件。在实际编程中,应根据头文件的来源和用途选择合适的包含方式。

动态链接

  两种形式:

  1. 可能应用程序在启动时就可能会报错,没找个某个dll,所以不能启动程序,这是动态链接的一种方式,因为应用程序知道并且需要把动态库加载。
  2. 也可以完全动态的加载动态库,这样可执行文件和动态库就没有关系了。  

 先把静态链接的去掉,(可能这两者不能同时用?),一般dll文件都要与对应的lib文件配套使用,它们是同时编译的。

报错:找不到dll文件,复制放在exe文件旁边。

  • 28
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想进大厂~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值