windows生成库文件
库文件的生成,包括静态库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 }; extern "C" DLL_API ExportInterface* getInstance(); #ifdef DLL_EXPORTS class ExportClass: public ExportInterface { pirvate: std::string x; public: void foo(); //函数体在dllExample.cpp中实现 }; #endif |
dllExample.cpp:
#define DLL_EXPORTS #include "dllExample.h" extern "C" DLL_API ExportInterface* { ExportInterface* return } void ExportClass::foo() { //do return; } |
调用约定
关于多个库的嵌套:
§
静态库包含:静态库或者动态库
只需要对其它库的引用声明为extern即可,库的lib文件不会包含其它库的具体实现,主要在最终link的应用中包含其它库。
§
动态库包含 :静态、动态库
在本身库的地方应该包含静态库Lib,动态库的导入库lib,而后在最终调用本动态库的地方只需要引入这个库的导入即可。不过最终实现应该要有对应的动态库。
windows生成库文件的更多相关文章
- 安卓---下拉刷新---上拉加载---解决导入library等自生成库文件失败的问题
本文的下拉刷新以及上拉加载都是用PullToRefresh实现的,关于PullToRefresh的介绍以及源码,网上可以找到很多,本人在此不再赘述. PullToRefresh是一套实现非常好的下拉刷 ...
- windows生成dump文件
windows下程序有时突然崩溃了,偶发性的崩溃很难找.于是就需要保存崩溃时的dump信息了. 下面是关于如何生成dmp文件的代码. 头文件 #pragma once #include <win ...
- linux利用CMakeLists编译程序或生成库文件
#设置CMAKE最低版本 CMAKE_MINIMUM_REQUIRED(VERSION 2.8) #设置项目名称 SET(PROJECT_NAME Image_Test_01) #建立项目 PROJE ...
- Android NDK入门实例 计算斐波那契数列二生成.so库文件
上一篇文章输生成了jni头文件,里面包含了本地C代码的信息,提供我们引用的C头文件.下面实现本地代码,再用ndk-build编译生成.so库文件.由于编译时要用到make和gcc,这里很多人是通过安装 ...
- CCS模块库文件的生成与使用
在一个大的项目中,为了便于管理,有时需要将一个模块封装为库文件,并可以在项目中使用. 图表 1 项目 步骤如下: 1.右键-->new-->CCS Project 图表 2 新建ccs p ...
- eclipse上ndk环境的搭建&&so文件的生成&&jni文件的调用
JNI是java语言提供的Java和C/C++相互沟通的机制,Java可以通过JNI调用本地的C/C++代码,本地的C/C++的代码也可以调用java代码.JNI 是本地编程接口,Java和C/C++ ...
- 由动态库文件dll生成lib库文件(手动生成.def文件,然后使用lib命令编译,非常牛),同理可使用dll生成.a库文件
本文基于OpenBlas的编译和安装,来说明如何从一个dll文件生成lib库文件. 参考OpenBlas的说明“Howto generate import library for MingW”,和Mi ...
- 由动态库文件dll生成lib库文件
本文基于OpenBlas的编译和安装.来说明怎样从一个dll文件生成lib库文件. 參考OpenBlas的说明"Howto generate import library for MingW ...
- 【DSP开发】DSP能用VS2010生成的链接库文件吗?
[DSP开发]DSP能用VS2010生成的链接库文件吗? 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:可能这个问题让行家看上去就会莞尔一笑,但是很多 ...
随机推荐
- js获取response头信息
当我们使用ajax发起请求时,经常需要获取请求返回的头信息.默认情况下,js货可以获取如下头信息: Cache-Control Content-Language Content-Type Expirs ...
- Vue slot插槽内容分发
slot插槽使用 使用场景,一般父组件中又一大段模板内容需要运用到子组件上.或者更加复杂的,子组件需要运用到父组件大段模板内容,而子组件却不知道挂载的内容是什么.挂载点的内容是由父组件来决定的. Sl ...
- Git—推送代码至Github
Git—上传代码至Github 首先得有个Github的账户,然后创建一个库. 然后找到指向改库的URL 第一次上传需要设置用户邮箱,打开git安装文件/bin下面找到git.bash并打开,设置全局 ...
- Neutron :默认通过 dnsmasq 实现 DHCP 功能----Namespace
Neutron 提供 DHCP 服务的组件是 DHCP agent. DHCP agent 在网络节点运行上,默认通过 dnsmasq 实现 DHCP 功能. 配置 DHCP agent DHCP ...
- Scrum Meeting博客目录
博客要求 Scrum Meeting 博客 Scrum Meeting 博客目录 1.Alpha版本 [团队项目]第一次Scrum Meeting [团队项目]第二次Scrum Meeting [团队 ...
- 想要开发自己的PHP框架需要那些知识储备?
作者:安正超链接:https://www.zhihu.com/question/26635323/answer/33812516来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- 其它综合-使用Putty远程连接管理Linux实践
使用Putty远程连接管理Linux实践 1.获取putty 获取 putty有很多方法,以下是我为大家提供的下载地址: 个人网盘地址,提取码:tz83 官方下载地址 解释: 官方下载的是 zip 压 ...
- 在CENTOS上源码搭建LNMP环境
前言 1.操作前提: CentOS Linux release 7.5.1804: sudo用户(需要root权限): 2.需要安装的组件: nginx稳定版:nginx-1.14.0: MariaD ...
- css3 box-shadow阴影(外阴影与外发光)讲解
基础说明: 外阴影:box-shadow: X轴 Y轴 Rpx color; 属性说明(顺序依次对应): 阴影的X轴(可以使用负值) 阴影的Y轴(可以使用负值) 阴影 ...
- [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 ...