windows 使用devc++使用第三方库GNU_readline实现软件命令行自动补全
主要关于windows下第三方链接库的用法,以及devc++如何编译链接第三方库
1. 资料准备
- GNU_readline for win32官网下载链接
https://gnuwin32.sourceforge.net/packages/readline.htm
- 下载这个带有动态链接库的编译好的文件
- 下载这个带有动态链接库的编译好的文件
- 关于如何查看lib文件时静态库还是引入库的方法请看前面的博客关于lib.exe的安装使用
2. 使用devc++集成开发环境(IDE)构建
- 配置第三方库的路径
配置路径和链接的方式有两种,全局配置或者项目配置
- 全局配置
跳过后面补充 - 项目单独配置
找不到头文件
- 设置单击项目,然后再项目属性中设置头文件路径
- 加入头文件路径以后,重新编译,不再报前面的错误,又提示没有链接库
找不到链接库 - 还是再刚才的项目里设置加入链接库路径,这里的链接库是是引入库lib,不是静态库lib
- 重新编译链接查看结果
- 设置单击项目,然后再项目属性中设置头文件路径
- 运行阶段
运行阶段需要将bin下的真正的dll动态链接库放在生成的exe的根目录,才能运行,否则会提示找不到dll
因为下载的gnureadline编译的是动态链接库,使用引入库lib引入,编译链接的时候可以通过,真正运行的时候需要dll动态链接
补充:
关于windows动态链接库dll的显示调用和隐式调用
动态链接库的使用需要库的开发者提供生成的.lib文件和.dll文件。或者只提供dll文件。使用时只能使用dll中导出的函数,未导出的函数只能在dll内部使用。Dll的调用有显示连接和隐式连接两种:隐式连接需要三个东西,分别是*.h头文件,lib库(动态的),DLL库;显示连接只需要.dll文件即可。
2.1.1 隐式连接(动态链接库)
隐式链接需要三个东西,分别是*.h头文件,lib库(动态的),DLL库,而这里的lib库仅是编译的时候用,运行时候不用,运行时只用Dll
2.1.1.1 添加Lib
方法1: 通过设置工程配置来添加lib库.(跳过)主要介绍第二三种
方法2: 使用编译语句:
#ifdef _DEBUG
#pragma comment(lib,"..\\debug\\LedCtrlBoard.lib")
#else
#pragma comment(lib,"..\\release\\LedCtrlBoard.lib")
#endif
2.1.1.3 添加dll
一般将dll拷贝到运行时目录即可,与调用者exe文件在同一目录,当然有其他方法添加环境变量PATH
2.1.2 显示连接(动态链接库)
隐式链接虽然实现较简单,但除了必须的.dll文件外还需要DLL的.h文件和.lib文件,在那些只提供.dll文件的场合就无法使用,而只能采用显式链接的方式。这种方式通过调用API函数来完成对DLL的加载与卸载,能更加有效地使用内存,在编写大型应用程序时往往采用此方式。这种方法编程具体实现步骤如下:
①使用Windows API函数Load Library或者MFC提供的AfxLoadLibrary将DLL模块映像到进程的内存空间,对DLL模块进行动态加载。
②使用GetProcAddress函数得到要调用DLL中的函数的指针。
③不用DLL时,用Free Library函数或者AfxFreeLibrary函数从进程的地址空间显式卸载DLL。
使用LoadLibrary显式链接,那么在函数的参数中可以指定DLL文件的完整路径;如果不指定路径,或者进行隐式链接,Windows将遵循下面的搜索顺序来定位搜索DLL:
包含EXE文件的目录
工程目录
Windows系统目录
Windows目录
列在Path环境变量中的一系列目录
2.2 静态库lib的使用
静态lib中,一个lib文件实际上是任意个obj文件的集合,obj文件是cpp文件编译生成的。静态库的.lib文件包含了链接库的所有信息(函数代码和接口信息)。所以我们在调用静态库.lib时,只需要包含头文件目录(../include. .h),以及附加库目录即可。因此,静态链接库的使用需要库的开发者提供生成库的.h头文件和.lib文件
这种方法直观,方便,且可以按如上直接区分出Debug版本和Release版本的不同目录.当然,通过宏,还可以区分更多版本.但是在指定目录时,不小心容易出错.
linux 下使用动态链接库一般都是显示调用
在Linux系统下,使用动态链接库通常是通过显示调用的方式。这包括在编译时指定需要链接的动态链接库,以及在运行时确保系统能够找到这些动态链接库。
在编译时,可以使用-l
选项指定需要链接的动态链接库,例如:
gcc -o myprogram main.c -lmylibrary
上面的命令中,-lmylibrary
指定了需要链接名为libmylibrary.so
的动态链接库。
在运行时,系统会根据动态链接库的搜索路径来查找并加载所需的动态链接库。通常,系统会在默认的动态链接库搜索路径中查找,也可以通过设置LD_LIBRARY_PATH
环境变量来指定其他的动态链接库搜索路径。
因此,在Linux系统下,动态链接库的使用通常是通过显示调用的方式,包括在编译时指定链接的动态链接库,以及在运行时确保系统能够找到这些动态链接库。
windwos下一般是隐式调用
在Windows系统下,动态链接库的使用一般是通过隐式调用的方式。
隐式调用是指在编译时将动态链接库的信息嵌入到可执行文件中,而在运行时需要动态链接库的支持。在Windows系统下,通常会将动态链接库的信息嵌入到可执行文件中,这样在运行时就不需要显式地指定动态链接库的路径。
(最重要的区别)
当程序在Windows系统上运行时,系统会根据可执行文件中嵌入的动态链接库信息来查找并加载所需的动态链接库。通常,系统会在默认的动态链接库搜索路径中查找,也可以通过设置系统环境变量来指定其他的动态链接库搜索路径。
因此,一般来说,Windows系统下动态链接库的使用是通过隐式调用的方式。