如何静态链接dll
怎么静态链接dll?工程中使用了mysql的dll,我是用#pragma comment(lib, .....lib)来链接mysql的dll的。这
怎么静态链接dll?
工程中使用了mysql的dll,我是用#pragma comment(lib, ".....lib")来链接mysql的dll的。这样有个问题,就是生成的.exe文件运行时,需要dll,如果目录里没有就是提示缺失dll而失败。
请问:怎么将从mysql官网下载到的dll静态链接到.exe里面去呢,使生成的可执行文件可以单独运行?
另外:vs的运行时库选择MT就表示生成的.exe不必依赖运行时库可以单独运行吧?
[解决办法]
文件缺失,一般是自己提供下载地址,或者自己写修补程序(MySql好像不单独提供dll下载)。
MT只是微软的库使用静态库,非微软库,想不用dll,那么就编译成静态库,然后再连接。
[解决办法]
DLL就表示动态链接库,无法静态链接。
想要静态链接,必需使用库的静态链接版本.lib文件,此时是没有DLL文件提供的,就一个.lib文件。因此你必须找到静态链接库版本的.lib文件。
背景信息:
库有动态链接库和静态库,动态库一般生成两个文件,一个.dll文件和.lib文件,此时.lib文件只提供符号链接信息,可执行代码在dll中。而静态库只生成一个.lib文件,此时.lib文件往往比较大,其中包含了可执行代码。
[解决办法]
可以,但你要代码编译成静态的lib库文件
[解决办法]动态链接库的工作方式也决定了它先天具有比静态链接更多的优点,如下所述。
节约内存和减少交换:当应用程序使用动态链接时,多个进程可以同步使用一个DLL共享内存中DLL的单个副本。相比之下,当应用程序使用静态链接库时,Windows必须为每个应用程序装载一个库代码的副本到内存中。
节约磁盘空间:当应用程序使用动态链接时,多个应用程序可以共享磁盘上单个DLL副本。相比之下,当应用程序使用静态链接库时,每个应用程序要将库代码作为独立的副本链接到可执行镜像中。
当DLL中的函数修改时,只要函数参数、调用规定和返回值没有改变,使用DLL的应用程序不需要重新编译或链接。而静态链接的函数改变时,需要应用程序重新链接。
支持多语言编程:只要应用程序遵循相同的调用规范,则使用不同编程语言编写的程序可以调用相同的DLL函数。程序和DLL函数必须兼容:函数定义的参数入栈顺序,函数或应用程序谁来负责清理堆栈,参数是否传入寄存器中等方面必须兼容。
轻松的创建中间版本:通过将资源放入DLL中,使得创建应用程序的中间版本非常简单。如可以将应用程序的每个语言版本的字符串放到单独的一个资源DLL中,并为不同的语言版本装载合适的资源DLL就可以了。
虽然使用DLL有诸多的优点,但是也需要格外注意使用DLL的缺点。即调用DLL的应用程序不是独立的,程序的运行依赖于所使用的DLL是否存在。
[解决办法]动态库本来就是动态加载的。使用动态库有两种方法“动态”和“静态”。“动态”方式的实现是你写代码时候,先加载,再找到函数指针,然后再用,这种方法只需要dll文件。“静态”的方式不光需要dll文件,还需要相应的lib文件和h头文件,使用时候,包含头文件,然后引入lib,就可以直接调用头文件里声明的东西了。
两种方式运行时候,都要用到dll,只是代码实现有区别