新建一个静态库项目:
新建项目-win32,名字叫lib1,之后选择静态库,同时把预编译头的勾选去掉,其他都默认
默认什么文件都没生成,添加lib1.h和lib1.cpp(把上篇dll的两个文件的内容拷贝过来就行)
编译之后,在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文件不含真正的可执行二进制,只有导出函数列表的信息
新建项目-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文件不含真正的可执行二进制,只有导出函数列表的信息
本文详细介绍了如何在VC2010中创建静态库项目lib1,包括删除预编译头选项,添加源文件,以及实现数学函数。编译后在debug目录生成lib1.lib。使用lib1.lib时,只需包含lib1.h并使用#pragma comment(lib,"lib1.lib")。此外,文章还探讨了从DLL项目转换为LIB项目可能遇到的问题以及LIB和DLL之间的大小差异。"
125533962,10912945,R语言ggplot2详解:用colour参数创建分组散点图,"['R语言', '数据挖掘', '数据分析', '机器学习', '数据可视化']

6717

被折叠的 条评论
为什么被折叠?



