首页 > 编程语言 >C++ 链接库

C++ 链接库

时间:2023-08-20 16:44:47浏览次数:36  
标签:lib glfw3 路径 链接库 C++ dll include 属性

C++中使用库

分为两种,静态库和动态库。简单来说,静态库最后会被编译进二进制文件,动态库不会,需要二进制文件从外部载入。

以下操作均在Visual Studio 2022中进行,以32位GLFW为例子(glfw.org)。

首先下载glfw 32位的可执行程序。在解决方案目录创建一个Dependencies文件夹(名字无所谓),然后把glfw丢进去。

静态链接

修改属性配置时,注意配置范围和平台,这里使用的是32位的glfw,我希望debug和release都使用,就如图设置。

一定不要搞错啦!

设置Include路径

首先需要头文件,打开项目属性,配置属性 > C/C++ > 常规 > 附加包含目录, 输入$(SolutionDir)Dependencies\GLFW\include

这里的$(SolutionDir)表示解决方案目录,如果你放在了其他地方,注意修改路径。尽量避免使用绝对路径。

然后这个时候,在项目中引入头文件就行。

#include<iostream>
#include "GLFW/glfw3.h"

int main() {
	int a = glfwInit();
	std::cout << a << std::endl;
	return 0;
}

但是有个问题,无法编译通过,因为找不到库。

设置库路径

打开项目属性,配置属性 > 链接器 > 常规 > 附加库目录,添加$(SolutionDir)Dependencies\GLFW\lib-vc2022;

这里的$(SolutionDir)表示解决方案目录,如果你放在了其他地方,注意修改路径。尽量避免使用绝对路径。

打开项目属性,配置属性 > 链接器 > 输入 > 附加依赖项,添加glfw3.lib (多个依赖性分号隔开)

这里的glfw3.lib是静态库,动态库下面再说。

这个时候就可以正常使用了:

#include<iostream>
#include "GLFW/glfw3.h"

// 依旧是这个代码
int main() {
	int a = glfwInit();
	std::cout << a << std::endl;
	return 0;
}

这次编译通过,输出了1,表示glfwInit函数调用正常。

动态链接

设置Include路径

同上,一样一样的。

设置库路径

上面说到,打开项目属性,配置属性 > 链接器 > 输入 > 附加依赖项,添加glfw3.lib ,这个 glfw3.lib就是一个静态库。在这个目录下还能看到这样两个文件:

  • glfw3.dll
  • glfw3dll.lib

glfw3dll.lib就是动态库文件了,所以我们只需要把上面的glfw3.lib改为glfw3dll.lib。然后编译出来的程序就会寻找 glfw3.dll,从中加载出我们调用的函数。Like This:

然后就...

程序根本不知道你的dll文件在哪。通常程序会在同目录寻找dll文件,所以将glfw3.dll放到程序所在目录即可。Like This:

再次运行程序就不报错了。如果你想要放在其他路径,有下面几种方法:

  1. Linux中可以用 LD_LIBRARY_PATH 环境变量指定,这个类似于 PATH 机制(Windows就用PATH环境变量),比较直观,而且,可以放到 bashrc 中固化下来,也可以放到自己的 .bashrc 中只对本用户起作用;

  2. 如果只想对某一个特定的应用程序起作用的话,可以在编译时指定搜索路径。gcc 的 -Wl 和 -rpath 参数。

标签:lib,glfw3,路径,链接库,C++,dll,include,属性
From: https://www.cnblogs.com/orzmiku/p/17644226.html

相关文章

  • C++ 创建库并使用
    创建库并使用!>使用VisualStudio2022创建项目和解决方案首先创建一个空项目,这里叫Game,同时VisualStudio会帮你创建解决方案。这个项目是我们的应用程序。创建项目来存库!>以静态库为例、右键解决方案,添加新项目Engine。此时就有了两个项目,Game和Engine:打开E......
  • C++ 类
    类类是一种把数据和功能结合在一起的方法。使用class来定义一个类,像这样:classPlayer{//创建一个Player类intx=0,y=0;intspeed=1;};通过类创建一个对象(实例化),像这样:Playerplayer;成员变量可以使用点(.)来访问对象的属性。player.speed=2;但......
  • C++ 类和结构体内外的Static
    类和结构体外的Static这里的static指的是在类外的static,意味着你要声明的是static的符号,链接将只在内部。(换句话说作用域只在他所在的.cpp文件)。下面是几组例子来理解:例子1:main.cpp#include<iostream>usingnamespacestd;voidfun(){cout<<"fun()inmain.cpp"......
  • C++ 继承
    继承一个类可以继承另一个类,避免了代码复写。被继承的类被叫做基类,继承的类叫做派生类。(或者说是父类和子类)继承类型当一个类派生自基类,该基类可以被继承为public、protected或private几种类型。继承类型是通过上面讲解的访问修饰符access-specifier来指定的。我们几乎......
  • C++ 构造函数与析构函数
    构造函数和析构函数构造函数构造函数会在实例化对象的时候执行,可以在实例化时传入参数。构造函数没有返回值。不需要声明返回值。构造函数的函数名与类名保持一致。//classname:PlayerPlayer(intxa=0,intya=0){//构造函数,传入初始坐标进行初始化......
  • C++ 变量初始化总结
    堆空间,new操作初始化1、对于有自己写构造函数的类,不论类型名后面有没有括号()或者数组[],都用构造函数进行初始化,如果构造函数delete,则编译报错;2、如果没有构造函数,则不加括号的new只分配内存空间,不进行内存的初始化,3、而加了括号()的new会在分配内存的同时初始化为0。栈空间......
  • c++基础入门
    1.安装g++编译器是编译C++代码使用的编译器,不要使用gcc了。在用户目录中单独创建一个文件夹存放下载后的3个安装文件,然后进入到目录中执行下面命令cd文件夹sudodpkg-i*.deb本地安装sudoapt-getinstallg++在线安装2.C++的语言特点及优势cwithclass(类)cplusplus大型......
  • c++算法之动态规划:01背包
    什么是动态规划?动态规划算法(dynamicprograming),是一种由递推为基础的比贪心更稳定的一种优化策略,为运筹学的一部分。就是通过以递推为基础的手段非暴力求出最值。它的总体思想其实就是一个比较过程:假如你有一个数据,它的价值是x,代价为y,如果用动态规划就是和你不加这个元素和你加......
  • C/C++ 中 static 关键字解析
    局部静态变量的特点:全局数据区执行到函数内对象声明处首次初始化,若没有显示初始化,自动初始化为0,且只初始化一次始终驻留在全局区,直到程序结束,作用域为局部作用域,在函数或语句块内,生命周期到程序结束全局静态变量的特点:全局区在main函数执行前分配内存并初始化注意:......
  • 使用WebAssembly实现高性能计算:C++和Rust的案例分析
    WebAssembly是一种新型的低级字节码格式,它可以在浏览器中运行高效的编译代码。使用WebAssembly可以实现高性能计算、游戏引擎等功能,对于需要大量计算的Web应用程序来说尤为重要。本文将介绍使用WebAssembly实现高性能计算的两个案例:C++和Rust。C++C++是一种高性能的编程语言,它......