库文件的生成,包括静态库lib与动态库dll,需要改变编译输出的生成命令,可以一开始生成对应的库工程(或者在工程属性->常规->配置类型更改)。

附基本对应命令:

gcc –c -L

.o

Cl /c /link

.obj

ar

.a

lib

.lib

ld

.o

link

.dll

其中,动态库dll需要在所输出的“对象”前添加_declspec(dllexport)声明。

对于库的使用
,除了需要包含对应的头文件,静态库需要在文件中添加#prama comment(lib,"cof.lib")
或者在有以下几种情况:
1) 相同解决方案下,可在属性面板“框架与引用”添加静态库工程,并”c++”中添加include file即可
2) 在“link”的附加依赖项添加库的目录,在“输入”中使用添加cof.lib(与pragma同)

windows动态库有两种使用方式,使用lib导入库,二是使用window api

1)  lib导入库的使用方式与静态库同,但是头文件中的“对象”最好有_declspec(dllimport)声明

2)  window api不需要头文件

导出类:

1 简单例子

dllExample.h:

#pragma once

#ifdef DLL_EXPORTS

#define DLL_API __declspec(dllexport)

#else

#define DLL_API __declspec(dllimport)

#endif

extern DLL_API int a;

class DLL_API ExportClass

{

pirvate:

int x;

public:

void foo();

};

dllExample.cpp:

#define DLL_EXPORTS

#include "dllExample.h"

int a = 4;

void ExportClass::foo()

{

//do something...

return;

}

不过这种简单的DLL导出存在一个限制,如果我们导出的类中含有非C++基础类型:

dllExample.h:

#pragma once

#ifdef DLL_EXPORTS

#define DLL_API __declspec(dllexport)

#else

#define DLL_API __declspec(dllimport)

#endif

class DLL_API ExportClass

{

pirvate:

std::string x; //此处的string类型导出是不安全的

public:

void foo();

};

我们知道, 对于STL,微软为每个版本的VS都有不同的实现,VS2008(VC90),VS2010(VC100),VS2013(VC120)。
由于不同的STL的实现,我们不能在不同的版本见直接传递std::string, 否则运行期可能出现不可预知的错误。
而事实上我们在ExportClass中的std::string x变量是不希望被外部直接使用的,也就是并没有export的必要,事实上,不建议让dll向外导出任何关于非C++基础类型的定义。
但是由于ExportClass需要向外导出(因为需要使用foo()函数),应该如何处理这样的矛盾呢?

对于这样的问题,我们需要使用C++的抽象类(其实就是java中的interface概念)来解决:
我们需要:
1. 申明一个只有纯虚函数和C++基础类型的基类,所有需要向外部导出的定义都包含在该类中。
2. 申明另一个类,继承该基类。
3. 实现一个返回基类函数指针的getInstance函数,即返回一个派生类实例的工厂方法。
4. 在外部代码中,通过多态机制访问该类。

dllExample.h:

#pragma once

#ifdef DLL_EXPORTS

#define DLL_API __declspec(dllexport)

#else

#define DLL_API __declspec(dllimport)

#endif

class DLL_API ExportInterface

{

public:

virtual void
foo() = 0;

};

extern "C" DLL_API ExportInterface*  getInstance();

#ifdef DLL_EXPORTS 
//我们并不需要向外导出该类的定义,在外部代码编译时,也不需要包含此类的定义。

class ExportClass: public ExportInterface

{

pirvate:

std::string x;
//由于外部代码对此不可见,此处的std::string是安全的。

public:

void foo(); //函数体在dllExample.cpp中实现

};

#endif

dllExample.cpp:

#define DLL_EXPORTS

#include "dllExample.h"

extern "C" DLL_API ExportInterface*
getInstance()

{

ExportInterface*
pInstance = new ExportClass();

return
pInstance;

}

void ExportClass::foo()

{

//do
something...

return;

}

调用约定

关于多个库的嵌套:

§  
静态库包含:静态库或者动态库

只需要对其它库的引用声明为extern即可,库的lib文件不会包含其它库的具体实现,主要在最终link的应用中包含其它库。

§  
动态库包含 :静态、动态库

在本身库的地方应该包含静态库Lib,动态库的导入库lib,而后在最终调用本动态库的地方只需要引入这个库的导入即可。不过最终实现应该要有对应的动态库。

windows生成库文件的更多相关文章

  1. 安卓---下拉刷新---上拉加载---解决导入library等自生成库文件失败的问题

    本文的下拉刷新以及上拉加载都是用PullToRefresh实现的,关于PullToRefresh的介绍以及源码,网上可以找到很多,本人在此不再赘述. PullToRefresh是一套实现非常好的下拉刷 ...

  2. windows生成dump文件

    windows下程序有时突然崩溃了,偶发性的崩溃很难找.于是就需要保存崩溃时的dump信息了. 下面是关于如何生成dmp文件的代码. 头文件 #pragma once #include <win ...

  3. linux利用CMakeLists编译程序或生成库文件

    #设置CMAKE最低版本 CMAKE_MINIMUM_REQUIRED(VERSION 2.8) #设置项目名称 SET(PROJECT_NAME Image_Test_01) #建立项目 PROJE ...

  4. Android NDK入门实例 计算斐波那契数列二生成.so库文件

    上一篇文章输生成了jni头文件,里面包含了本地C代码的信息,提供我们引用的C头文件.下面实现本地代码,再用ndk-build编译生成.so库文件.由于编译时要用到make和gcc,这里很多人是通过安装 ...

  5. CCS模块库文件的生成与使用

    在一个大的项目中,为了便于管理,有时需要将一个模块封装为库文件,并可以在项目中使用. 图表 1 项目 步骤如下: 1.右键-->new-->CCS Project 图表 2 新建ccs p ...

  6. eclipse上ndk环境的搭建&&so文件的生成&&jni文件的调用

    JNI是java语言提供的Java和C/C++相互沟通的机制,Java可以通过JNI调用本地的C/C++代码,本地的C/C++的代码也可以调用java代码.JNI 是本地编程接口,Java和C/C++ ...

  7. 由动态库文件dll生成lib库文件(手动生成.def文件,然后使用lib命令编译,非常牛),同理可使用dll生成.a库文件

    本文基于OpenBlas的编译和安装,来说明如何从一个dll文件生成lib库文件. 参考OpenBlas的说明“Howto generate import library for MingW”,和Mi ...

  8. 由动态库文件dll生成lib库文件

    本文基于OpenBlas的编译和安装.来说明怎样从一个dll文件生成lib库文件. 參考OpenBlas的说明"Howto generate import library for MingW ...

  9. 【DSP开发】DSP能用VS2010生成的链接库文件吗?

    [DSP开发]DSP能用VS2010生成的链接库文件吗? 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:可能这个问题让行家看上去就会莞尔一笑,但是很多 ...

随机推荐

  1. js获取response头信息

    当我们使用ajax发起请求时,经常需要获取请求返回的头信息.默认情况下,js货可以获取如下头信息: Cache-Control Content-Language Content-Type Expirs ...

  2. Vue slot插槽内容分发

    slot插槽使用 使用场景,一般父组件中又一大段模板内容需要运用到子组件上.或者更加复杂的,子组件需要运用到父组件大段模板内容,而子组件却不知道挂载的内容是什么.挂载点的内容是由父组件来决定的. Sl ...

  3. Git—推送代码至Github

    Git—上传代码至Github 首先得有个Github的账户,然后创建一个库. 然后找到指向改库的URL 第一次上传需要设置用户邮箱,打开git安装文件/bin下面找到git.bash并打开,设置全局 ...

  4. Neutron :默认通过 dnsmasq 实现 DHCP 功能----Namespace

    Neutron 提供 DHCP 服务的组件是 DHCP agent. DHCP agent 在网络节点运行上,默认通过 dnsmasq 实现 DHCP 功能.   配置 DHCP agent DHCP ...

  5. Scrum Meeting博客目录

    博客要求 Scrum Meeting 博客 Scrum Meeting 博客目录 1.Alpha版本 [团队项目]第一次Scrum Meeting [团队项目]第二次Scrum Meeting [团队 ...

  6. 想要开发自己的PHP框架需要那些知识储备?

    作者:安正超链接:https://www.zhihu.com/question/26635323/answer/33812516来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

  7. 其它综合-使用Putty远程连接管理Linux实践

    使用Putty远程连接管理Linux实践 1.获取putty 获取 putty有很多方法,以下是我为大家提供的下载地址: 个人网盘地址,提取码:tz83 官方下载地址 解释: 官方下载的是 zip 压 ...

  8. 在CENTOS上源码搭建LNMP环境

    前言 1.操作前提: CentOS Linux release 7.5.1804: sudo用户(需要root权限): 2.需要安装的组件: nginx稳定版:nginx-1.14.0: MariaD ...

  9. css3 box-shadow阴影(外阴影与外发光)讲解

    基础说明:     外阴影:box-shadow: X轴  Y轴  Rpx  color;     属性说明(顺序依次对应): 阴影的X轴(可以使用负值)    阴影的Y轴(可以使用负值)    阴影 ...

  10. [BZOJ 3745] [COCI 2015] Norma

    Description 给定一个正整数序列 \(a_1,a_2,\cdots,a_n\),求 \[ \sum_{i=1}^n\sum_{j=i}^n(j-i+1)\min(a_i,a_{i+1},\c ...