新建项目-win32,名字叫lib1,之后选择静态库,同时把预编译头的勾选去掉,其他都默认
默认什么文件都没生成,添加lib1.h和lib1.cpp(把上篇dll的两个文件的内容拷贝过来就行)
// dll1.cpp : 定义 DLL 应用程序的导出函数。//
// testdll.cpp : 定义 DLL 应用程序的导出函数。
#include "lib1.h"
#include <stdexcept>
using namespace std;
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 invalid_argument("b cannot be zero!");
}
return a / b;
}
}
//testdll.h#define TESTDLL_EXPORTS#ifdef TESTDLL_EXPORTS #define TESTDLL_API __declspec(dllexport) #else #define TESTDLL_API __declspec(dllimport) #endif namespace MathFuncs { // This class is exported from the testdll.dll class MyMathFuncs { public: // Returns a + b static TESTDLL_API double Add(double a, double b); // Returns a - b static TESTDLL_API double Subtract(double a, double b); // Returns a * b static TESTDLL_API double Multiply(double a, double b); // Returns a / b // Throws const std::invalid_argument& if b is 0 static TESTDLL_API double Divide(double a, double b); }; }
编译之后, 在debug文件夹生成lib1.lib
使用方法,同使用dll。不同的是不用拷贝dll了(没有dll可拷),其他和dll的使用方式都一样,比如都要#pragma comment(lib,"xxx.lib")
值得一体的是,调用程序不需要设置为静态链接方式。
在使用的地方添加:
#include "lib1.h"
#pragma comment(lib,"lib1.lib")
调用函数:
int sum = MathFuncs::MyMathFuncs::Add(1, 2);
TRACE("sum = %d\n",sum);
附1:使用vc2010自带的dumpbin查看lib的导出函数
dumpbin /LINKERMEMBER Test.lib > 1.txt
附2:
发现如果之前是一个dll的项目,如果按照如下方式变更为lib
项目 -> 配置属性->常规->配置类型 :静态库
然后生成一个lib文件,使用这个lib的时候,貌似不好用
而原来是一个lib库的项目,通过更改 项目 -> 配置属性->常规->配置类型 :动态库 的方式生成的lib和dll,则是可以使用
同时也可以发现,对于同一个项目,lib库项目生成的lib文件很大,改为dll库项目后生成的同名lib文件很小.
这也说明这个小lib文件不含真正的可执行二进制,只有导出函数列表的信息