使用Visual Studio 2017写静态库
造*是一件有趣的事情,vs是一个强大的工具,能胜任超大规模的工程,但是讲真,对不那么大的项目配置起来不是那么友好(网上的其他教程也一点都不友好orz)。这里就展示一下构建一个简单的静态库的正确姿势。(顺便教一点道理
创建解决方案——许多人搞不清工程/项目project和解决方案solution的区别,在vs中,project是基本的执行单元,一个solution可以包含多个project——我们的静态库就将会包含几个(.lib)project和一个(.exe)project用作测试。解决方案选win32 console application控制台。
类型选static library静态库,去掉precompiled header预编译头选项。
添加头文件和源文件。
源文件.cpp同理,之后应该是这个样子:
(注意,只添加.h文件而没有.cpp是不行的,这样一个工程编译不出来.lib库,之后你测试的时候就会出现" "xxx.lib": cannot open file specified"之类的报错别问我怎么知道的orz)
(另一种回头cannot open file specified的原因是.lib生成的位置不对,在这里看solution explorer->properties属性页
->output direction输出目录
默认那个是对的在\debug目录下,谁知道怎么会错)
然后就可以写代码了:
// mathlib.h #pragma once int add(int x, int y); // mathlib.cpp #include "mathlib.h" int add(int x, int y) { return x + y; }
然后你需要一个project来测试(回想开头说的,一个solution可以有多个project,它们都是执行单位(一会会再讲到怎么叫执行单位这是我自己造的概念)),在solution explorer里面为solution加入新工程:
选控制台,把预编译头去掉和之前一样,现在我们得到了一个含有俩projects的solution了:
编写一段测试代码
// test.cpp #include "stdafx.h" #include "..\mathlib\mathlib.h" #include <iostream> int main() { std::cout << add(1, 2) << std::endl; return 0; }
现在需要为test添加mathlib的引用,这一步实际的作用是,在引导ide用cl编译器命令行编译的时候,加入正确的链接选项(csapp有非常inspiring的讲解,源文件#include了头文件以后只是为链接器介绍了一堆未重定位的符号,它需要在库文件(静态库的话linux是.a文件windows是.lib)里找这些符号完成重定位),找到这些库很重要。在solution explorer里面add reference如图
vs很贴心地把solution里的projects列进了备选项,选中即可。
此时test的reference里就有mathlib工程了。
下一步,为cl编译器添加include路径,也就是说,预编译期应该怎么找mathlib.h以完成符号的引入。在test properties属性页->c++->general->additional include directaries附加包含路径,就是额外于标准库头文件目录的其他(自定义)头文件包含的目录,cl要去这些地方找mathlib.h。选择添加mystaticlibrary\mathlib这个目录ok。
这个时候万事俱备,f5组建运行结果报了这么个错:
说.lib不是有效的win32应用不能运行。对呀我本来也没要运行它呀,可是vs怎么知道solution里面这么多projects应该运行哪一个?(想想之前的执行单元理解到是什么意思了吧,每个project编译的结果都认为可执行)第一个添加的project是mathlib所以vs默认去运行它的输出所以错了。想办法引导vs去运行test的输出(test.exe),solution explorer->mystaticlibrary properties属性页:
设单启动工程为test,ok。
build & run!
祝大家造*愉快!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
如何使用Visual Studio 2010在数据库中生成随机测试数据
-
Visual Studio 2017创建.net standard类库编译出错原因及解决方法
-
Visual Studio 2017使用淘宝镜像的方法
-
使用Visual Studio 2017作为Linux C++开发工具
-
使用Visual Studio 2017写静态库
-
Microsoft Visual Studio 2017 for Mac Preview安装使用案例分享
-
使用Visual Studio 2017写静态库
-
Visual Studio 2017的安装与使用
-
Visual Studio 2017创建.net standard类库编译出错原因及解决方法
-
android studio中怎么使用JNI之静态库?