当前位置:C++技术网 > 资讯 > lib库知识全面讲解:3 如何使用静态lib库?如何静态链接开源库第三方库?

lib库知识全面讲解:3 如何使用静态lib库?如何静态链接开源库第三方库?

更新时间:2015-10-24 22:41:51浏览次数:1+次

    在《lib库知识全面讲解2:lib静态库是如何生成的?怎么生成自己的lib静态库?中,我们学会了如何创建自己的静态lib库了。通过自己的实践,我们就很清楚人家的静态lib库是如何来的了。那么我们接下来的任务就是使用静态lib库了。
    先来说说我们经常疑问的问题就是如何静态链接一个第三方库。那么这个问题,是因为对此一无所知导致的。只要看了这一系列的文章,这都不是问题。因为之前我也这么疑问过。
    那么我们为什么要静态链接呢?我们写过MFC程序,程序给别人运行的时候,总是提示什么MFC的dll不存在,这个是一个很麻烦的问题。我们也懒得去一个个找到这个dll放在exe文件一起,这样发给别人真心麻烦。还有,我们总不喜欢一大堆东西去找一个exe运行,很多人小白哦,根本就不知道去双击exe运行。那你只给exe的时候,他看上去还有选择吗?那肯定是直接双击exe。对于小白这个,都不是关键。
    MFC程序项目默认的是共享DLL方式,也就是动态链接的。动态链接意味着链接的时候并没有把MFC库打包到exe中,所以,当运行程序的电脑没有MFC库的时候,就缺少了MFC库。
    对于程序文件大小不限制的情况下,尽可能使用静态链接。这样分享软件时候,就方便了。只不过就是静态链接的程序会大一点点而已。
    然而,我们很多时候写的并不是MFC程序,那么此时要静态链接,如何做?比如我们在使用opencv时,如果使用的是静态链接,那就不用带上一堆dll了。那些dll那么多看上去都恐怖。然而,我们知道要静态链接,但是很多人也不知道如何静态链接,甚至连需要拿什么来链接都不清楚。是IDE设置还是需要准备特定的文件呢?
    有时候我们只得到了dll文件和头文件还有与dll对应的lib导入库文件,这个时候是没有办法静态链接的哦。这个关键在于需要有静态lib,这个静态lib库包含了所有的二进制代码,才能链接。lib导入库是没有代码的,只是对dll的说明。所以,第一步如果你不清楚,一直在找如何用dll静态链接,一辈子都搞不定这个问题。
    如果是开源库或第三方,一般是提供两种方式的,或者你要静态链接,就下载静态lib版本。有了东西才好办事。
    好了,我们下面来看看如何静态链接第三方库,或者说是如何使用静态lib库吧。
    你先要有一个建立好的项目,然后,将你得到的lib文件和头文件放在你项目的源文件文件夹下,也就是和.c或.cpp文件放在一起。好了,文件准备好后,我们在VS中的“解决方案资源管理器”的“头文件”项右击,添加“现有项”,然后添加刚才得到的第三方库的头文件。
    我们这里就添加《lib库知识全面讲解2:lib静态库是如何生成的?怎么生成自己的lib静态库? 》生成的静态lib库的头文件。然后在我们自己的源文件m.cpp中写好main函数,在开头包含test.h,然后在main调用test头文件声明的函数show。我们使用静态lib库的项目是生成exe哦。如下图所示:

   
    然后我们直接按F5调试运行,这样会自动编译链接运行。然后发现了问题,提示:

1>m.obj : error LNK2001: 无法解析的外部符号 "void __cdecl show(char *)" (?show@@YAXPAD@Z)
1>C:\Users\wdx\documents\visual studio 2015\Projects\Console_1\Release\Console_1.exe : fatal error LNK1120: 1 个无法解析的外部命令

     这个“无法解析的外部命令”和“fatal error LNK1120”想必是大家经常碰见的吧。这里提示的是show函数无法解析。虽然后函数声明,但是却找不到函数定义在哪里。看到这个错误,你应该知道你的函数没有写定义。因为这个是静态lib库的,所以,你就应该想到,这个是没有引入静态lib库的原因哦。
    是的,我们要静态链接,其实就是要引入静态lib库,这样的话,最终链接后,就打包到exe了。引入静态lib就是这里的关键哦。其他的都和普通的程序一样。添加头文件和包含头文件,没有其他不一样的地方。不一样的就是没有提供函数的定义。那么静态lib的函数定义就在这个文件中,所以我们引入后,就补全了函数定义了。而这个引入静态lib库,最终也完成了将代码打包到了exe。
    好了。我们先用VS的项目设置来引入。依次点击下面的菜单:“项目” -> “XXX项目”,弹出项目属性页,然后找到“配置属性”-> "链接器" -> “输入” -> “附加依赖项”,如下图所示:

   
     从图中可以看到,这里面已经有了一些静态lib库了。然后单击一下“附加依赖项”选中后就出现了下拉箭头,再点击右边的下拉箭头,然后点击编辑,如下图所示:
   
    然后弹出编辑框,输入我们放在项目源码文件夹的lib文件名,如下图所示:
   
    然后确定即可。我们再按VS的菜单“生成”->“重新生成解决方方案”,成功!如下图所示:
   

    这里要一下上一篇提到的,如果在生成lib的项目中写了main函数,情况会如何?我们实验了一下,然后将生成的lib引入重新生成解决方案,出现了如下的错误:

1>m.obj : error LNK2005: _main 已经在 Console_1.lib(test.obj) 中定义
1>C:\Users\wdx\documents\visual studio 2015\Projects\Console_1\Release\Console_1.exe : fatal error LNK1169: 找到一个或多个多重定义的符号
     错误提示_main已经定义,“找到一个或多个多重定义的符号”,说明我们现在的项目中的main和静态lib库中的冲突了。这也证明了上一篇中说的,不能在静态lib库中写main函数咯。希望通过这个实验让你清楚。