用Visual Studio2017写C++静态库图文详解

 更新时间:2017年04月28日 13:59:13   作者:jily16  
这篇文章主要介绍了用Visual Studio2017写C++静态库的图文教程,需要的朋友可以参考下

造轮子是一件有趣的事情,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。

以上所述是小编给大家介绍的用Visual Studio2017写C++静态库,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • C++ 常量成员常量返回值详解

    C++ 常量成员常量返回值详解

    这篇文章主要介绍了C++ 常量成员常量返回值详解,需要的朋友可以参考下
    2017-06-06
  • 深入浅出理解C语言指针的综合应用

    深入浅出理解C语言指针的综合应用

    指针是指向另一个变量的变量。意思是一个指针保存的是另一个变量的内存地址。换句话说,指针保存的并不是普通意义上的数值,而是另一个变量的地址值。一个指针保存了另一个变量的地址值,就说这个指针“指向”了那个变量
    2022-02-02
  • 详解C++泛型装饰器

    详解C++泛型装饰器

    这篇文章主要为大家介绍了C++的泛型装饰器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • C语言模拟实现C++的继承与多态示例

    C语言模拟实现C++的继承与多态示例

    本篇文章主要介绍了C语言模拟实现C++的继承与多态示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • c语言将字符串中的小写字母转换成大写字母

    c语言将字符串中的小写字母转换成大写字母

    本文主要介绍了c语言将字符串中的小写字母转换成大写字母的方法实例。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-04-04
  • C++实现简易的弹球小游戏

    C++实现简易的弹球小游戏

    这篇文章主要为大家详细介绍了C++实现简易的弹球小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • 使用matlab绘制七夕表白玫瑰花束

    使用matlab绘制七夕表白玫瑰花束

    又是一年七夕节要到了,每年一次直男审美MATLAB绘图大赛开始了,于是今年对我之前写的老代码进行了点优化组合,整了个花球变花束,感兴趣的小伙伴可以动手试一试
    2023-08-08
  • C语言实现模拟银行系统

    C语言实现模拟银行系统

    这篇文章主要为大家详细介绍了C语言实现模拟银行系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C++实现LeetCode(151.翻转字符串中的单词)

    C++实现LeetCode(151.翻转字符串中的单词)

    这篇文章主要介绍了C++实现LeetCode(151.翻转字符串中的单词),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++ 中使用不同平台的时间函数及对比分析

    C++ 中使用不同平台的时间函数及对比分析

    在C++ 编程中,时间函数的选择对于性能测量、任务调度和时间戳记录至关重要,本文将介绍在 C++ 中常用的时间函数,并比较它们在不同平台上的应用和效果,感兴趣的朋友跟随小编一起看看吧
    2024-06-06

最新评论