关于使用Visual编译静态库动态库及其使用的问题
本文主要讲述了如何使用Visual Studio 2013 编译静态库和动态库,并使用。
一、静态库
1、 编写静态库
若要创建将引用并使用刚创建的静态库的应用程序,请从“文件”菜单中选择“新建”,然后选择“项目”。
A 在“项目类型”窗格中,选择“Visual C++”下的“Win32”。
B 在“模板”窗格中,选择“Win32 控制台应用程序”。
C 为项目选择一个名称(如 MyExecRefsLib),并将其键入“名称”字段。 在“解决方案”旁边的下拉列表框中选择“添入解决方案”。 这会将新项目添加到该静态库所属的同一个解决方案中。
D单击“确定”启动“Win32 应用程序向导”。 在“Win32 应用程序向导”对话框的“概述”页中,单击“下一步”。
E 在“Win32 应用程序向导”的“应用程序设置”页中,选择“应用程序类型”下的“控制台应用程序”。
F 在“Win32 应用程序向导”的“应用程序设置”页中,清除“附加选项”下的“预编译头”。
单击“完成”创建项目。
然后新建一个头文件一个源文件如下:
// 头文件
#pragma once
// MathLIB.h
namespace MathFuncs
{
class MyMathFuncs
{
public:
// Returns a + b
static double Add(double a, double b);
// Returns a - b
static double Subtract(double a, double b);
// Returns a * b
static double Multiply(double a, double b);
// Returns a / b
// Throws DivideByZeroException if b is 0
static double Divide(double a, double b);
};
}
//源文件
#include <stdexcept>
#include "MathLIB.h"
namespace MathFuncs
{
double MyMathFuncs::Add(double a, double b)
{
return a + b;
}
double MyMathFuncs::Subtract(double a, double b)
{
return a - b;
}
double MyMathFuncs::Multiply(double a, double b)
{
return a * b;
}
double MyMathFuncs::Divide(double a, double b)
{
if (b == 0)
{
throw new std::invalid_argument("b cannot be zero!");
}
return a / b;
}
}
添加完你自定义的接口后,直接编译。在Debug(Release)下得到TestLIB.lib文件。至此,你的静态库生成完毕。
2、 使用静态库
使用 #pragma comment导入lib库
#include "..\\myLib\\MathLIB.h"
#pragma comment(lib,"..\\myLib\\TestLIB.lib")
int _tmain(int argc, _TCHAR* argv[])
{
double a = 6.3;
double b = 2;
double res = MathFuncs::MyMathFuncs::Add(a, b);
printf("%f", res);
return 0;
}
注意,这里的#pragma comment一定要在include头文件之后。
如果你不想使用相对路径,你可以在下面的目录中加入你头文件和静态库的路径。
然后,你就可以直接导入头文件和LIB库文件了。
二、动态库
使用lib需注意两个文件:
•.h头文件,包含lib中说明输出的类或符号原型或数据结构。应用程序调用lib时,需要将该文件包含入应用程序的源文件中。
•.LIB文件。
使用dll需注意三个文件:
•.h头文件,包含dll中说明输出的类或符号原型或数据结构的.h文件。应用程序调用dll时,需要将该文件包含入应用程序的源文件中。
•.LIB文件,是dll在编译、链接成功之后生成的文件,作用是当其他应用程序调用dll时,需要将该文件引入应用程序,否则产生错误(如果不想用lib文件或者没有lib文件,可以用WIN32 API函数LoadLibrary、GetProcAddress装载)。
•dll文件,真正的可执行文件,开发成功后的应用程序在发布时,只需要有.exe文件和.dll文件,并不需要.lib文件和.h头文件。
注意,Dll中的LIB文件和静态库中的LIB文件不是一回事。Dll中的LIB文件是第三方应用程序调用Dll的一个桥梁,而静态库中的LIB文件是库文件。
1、创建动态库
#pragma once
//头文件
namespace MathCalculate
{
class MyMath
{
public:
static int add(int a, int b);
};
}
// cpp文件
#include "Calculate.h"
int MathCalculate::MyMath::add(int a, int b)
{
return a + b;
}
除此之外,还需要添加一个def文件,来导出函数接口,
LIBRARY "MyDll"
EXPORTS
add @1
编译完成,Debug(Release)目录下即有相关的Dll库和中间文件lib。
3、 如何使用dll文件呢。
Lib文件和头文件使用同静态库一致,唯一需要主要的是,我们需要把Dll文件放在系统目录(C:\Windows\SysWOW64或者C:\Windows\System32)或者当前可执行文件的同一级目录下。
题外话:VC++工程中的基本路径是Debug(Release)路径,使用相对路径时,指得就是这个路径。同时,include中的路径可以不用使用转义字符,但是pragma comment中的路径必须要使用转义字符。
#include "..\myDll\Calculate.h"
#pragma comment(lib, "..\\myDll\\MyDll.lib")
这样写是可以的。
关于使用Visual编译静态库动态库及其使用的问题的更多相关文章
- C/C++ 跨平台交叉编译、静态库/动态库编译、MinGW、Cygwin、CodeBlocks使用原理及链接参数选项
目录 . 引言 . 交叉编译 . Cygwin简介 . 静态库编译及使用 . 动态库编译及使用 . MinGW简介 . CodeBlocks简介 0. 引言 UNIX是一个注册商标,是要满足一大堆条件 ...
- C++开发新版本vs使用旧版本vs编译的静态库动态库
关于vs潜在的升级问题概述 (Visual C++)查看官网的介绍:潜在的升级问题概述 (Visual C++).主要问题: 1. 如果使用 /GL(全程序优化)进行编译,则生成的对象文件只能使用生成 ...
- gcc编译工具生成动态库和静态库之一----介绍
1.库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. ...
- 静态库动态库的编译、链接, binutils工具集, 代码段\数据段\bss段解释
#1. 如何使用静态库 制作静态库 (1)gcc *.c -c -I../include得到o文件 (2) ar rcs libMyTest.a *.o 将所有.o文件打包为静态库,r将文件插入静态库 ...
- 生成lua的静态库.动态库.lua.exe和luac.exe
前些日子准备学习下关于lua coroutine更为强大的功能,然而发现根据lua 5.1.4版本来运行一段代码的话也会导致 "lua: attempt to yield across me ...
- 修改OpenSSL默认编译出的动态库文件名称
在 Windows 平台上调用动态链接库 dll 文件时,有两种方式:a) 隐式的加载时链接:使用 *.lib (导入库)文件,在 IDE 的链接器相关设置中加入导入库 lib 文件的名称,或在程序中 ...
- linux静态与动态库创建及使用实例
一,gcc基础语法: 基本语法结构:(由以下四部分组成) gcc -o 可执行文件名 依赖文件集(*.c/*.o) 依赖库文件及其头文件集(由-I或-L与-l指明) gcc 依赖文件集(*.c/*.o ...
- Linux 静态库&动态库调用
1.什么是库在windows平台和linux平台下都大量存在着库.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和linux的本质不同,因此二者库的二进制是不 ...
- windows库的创建和使用:静态库+动态库
windows库的创建和使用:静态库+动态库 一.静态库的创建和使用 1. 静态库创建 (1)首先创建projecttest,測试代码例如以下: 1) test.h void test_print ...
- Linux中创建和使用静态库&动态库
库本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行 Linux下库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同点在于代码被载入的时刻不同. 静态库的代码在 ...
随机推荐
- 《面向对象程序设计(java)》第七周学习总结
1.实验目的与要求 (1)进一步理解4个成员访问权限修饰符的用途: (2)掌握Object类的常用API用法: (3)掌握ArrayList类用法与常用API: (4)掌握枚举类使用方法: (5)结合 ...
- PropTypes验证器
PropTypes用于对类型的验证,从而更加容易捕获bug.在React v15.5之前,它内置React.PropTypes函数帮助解决,之后放弃支持,采用prop-types库定义. import ...
- git本地推送远程
第一次将本地映射到已经存在的仓库 https://techoverflow.net/2017/08/09/how-to-solve-git-fatal-no-configured-push-desti ...
- MySQL master-slave主从复制环境搭建初试
环境为centos 7.2+mysql 5.7,网上教程很多,原理也不复杂(深知自己踩的坑还不够) 正常情况下,配置起来比较简单.另外,根据个人感受,MySQL的复制感觉要比SQL Server的复制 ...
- 记账本,C,Github,util
package util; import java.awt.Component; import java.awt.Dimension; import javax.swing.JButton; impo ...
- mui之上拉刷新和mui-content结合解决ios上拉不回弹的bug
打电话.发短信 https://blog.csdn.net/itguangit/article/details/78210770
- 原子性: Interlocked 类
public class CounterNoLock:CountBase { private int _count; public int Count { get { return _count; } ...
- IO高级应用关于字符码表
ASCII码表: 计算机里只有数字,我在计算机软件里的一切都是用数字来表示,屏幕上显示的一个个字符也不例外.计算机诞生在美国,最开始所用到字符就是我们现在键盘上的一些符号和少数几个特殊的符号,每一个字 ...
- MySQL 详细学习笔记
Windows服务 -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意:等号与值 ...
- 134. Gas Station加油站
[抄题]: There are N gas stations along a circular route, where the amount of gas at station i is gas[i ...