vc2010创建lib和使用

来源:互联网 发布:js删除对象元素 编辑:程序博客网 时间:2024/05/20 12:21
新建一个静态库项目:
新建项目-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文件不含真正的可执行二进制,只有导出函数列表的信息


原创粉丝点击