用视觉Studio2017写c++静态库图文详解

  

造轮子是一件有趣的事情,和是一个强大的工具,能胜任超大规模的工程,但是讲真,对不那么大的项目配置起来不是那么友好(网上的其他教程也一点都不友好下跪)。这里就展示一下构建一个简单的静态库的正确姿势。(顺便教一点道理

  

创建解决方案,许多人搞不清工程/项目项目和解决方案解决的区别,在大战中,项目是基本的执行单元,一个解决方案可以包含多个项目——我们的静态库就将会包含几个(lib)项目和一个(。exe)项目用作测试。解决方案选win32控制台应用程序控制台。

  

坝檬泳鮏tudio2017写c++静态库图文详解"

  

类型选静态库静态库,去掉预编译头预编译头选项。

  

坝檬泳鮏tudio2017写c++静态库图文详解"

  

添加头文件和源文件。

  

坝檬泳鮏tudio2017写c++静态库图文详解"

  

源文件. cpp同理,之后应该是这个样子:

  

坝檬泳鮏tudio2017写c++静态库图文详解"

  

(注意,只添加. h文件而没有. cpp是不行的,这样一个工程编译不出来。lib库,之后你测试的时候就会出现”“xxx。自由”:无法打开文件指定”之类的报错别问我怎么知道的下跪)

  

(另一种回头不能打开文件指定的原因是。自由生成的位置不对,在这里看解决方案资源管理器→属性属性页

  

坝檬泳鮏tudio2017写c++静态库图文详解"

  

→输出方向输出目录

  

坝檬泳鮏tudio2017写c++静态库图文详解"

  

默认那个是对的在\调试目录下,谁知道怎么会错)

  

然后就可以写代码了:

     //MathLib.h   # pragma alt="用视觉Studio2017写c++静态库图文详解">

  

选控制台,把预编译头去掉和之前一样,现在我们得到了一个含有俩项目的解决方案了:

  

坝檬泳鮏tudio2017写c++静态库图文详解"

  

编写一段测试代码

     //Test.cpp   # include“stdafx.h”   # include“. . \ MathLib \ MathLib.h”   # include & lt; iostream>   int main ()   {   std:: cout & lt; & lt;添加(1、2)& lt; & lt;std:: endl;   返回0;   }      

现在需要为测试添加MathLib的引用,这一步实际的作用是,在引导IDE用cl编译器命令行编译的时候,加入正确的链接选项(CSAPP有非常鼓舞人心的讲解、源文件# include了头文件以后只是为链接器介绍了一堆未重定位的符号,它需要在库文件(静态库的Linux是话。文是件窗口。lib)里找这些符号完成重定位),找到这些库很重要。在解决方案资源管理器里面添加参考如图

  

坝檬泳鮏tudio2017写c++静态库图文详解"

  

VS很贴心地把解决方案里的项目列进了备选项,选中即可。

  

坝檬泳鮏tudio2017写c++静态库图文详解"

  

此时测试的参考里就有MathLib工程了。

  

下一步,为cl编译器添加包括路径,也就是说,预编译期应该怎么找MathLib。h以完成符号的引入。在测试属性属性页→c++→→将军额外包括Directaries附加包含路径,就是额外于标准库头文件目录的其他(自定义)头文件包含的目录,cl要去这些地方找MathLib.h。选择添加MyStaticLibrary \ MathLib这个目录好的。

  

坝檬泳鮏tudio2017写c++静态库图文详解“
  

  

这个时候万事俱备,F5组建运行结果报了这么个错:

  

坝檬泳鮏tudio2017写c++静态库图文详解"

  

说lib不是有效的win32应用不能运行。对呀我本来也没要运行它呀,可是VS怎么知道解决方案里面这么多项目应该运行哪一个?(想想之前的执行单元理解到是什么意思了吧,每个项目编译的结果都认为可执行)第一个添加的项目是MathLib所以VS默认去运行它的输出所以错了。想办法引导VS去运行测试的输出(测试。exe),解决方案资源管理器→MyStaticLibrary属性属性页:

用视觉Studio2017写c++静态库图文详解