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
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,而后在最终调用本动态库的地方只需要引入这个库的导入即可。不过最终实现应该要有对应的动态库。

原文地址:https://www.cnblogs.com/resibe-3/p/8232928.html

时间: 2024-11-08 14:33:03

windows生成库文件的相关文章

【原创】源码编译libevent-2.0.21-stable生成库文件说明

按照 README 中的说明,首先执行 configure 下面的输出信息是针对源码编译所在机器进行的检测 [[email protected] libevent-2.0.21-stable]# ./configure checking for a BSD-compatible install... /usr/bin/install -c ... configure: creating ./config.status config.status: creating libevent.pc con

windows生成dump文件

windows下程序有时突然崩溃了,偶发性的崩溃很难找.于是就需要保存崩溃时的dump信息了. 下面是关于如何生成dmp文件的代码. 头文件 #pragma once #include <windows.h> #include <DbgHelp.h> #include <stdlib.h> #include <string> #pragma comment(lib, "dbghelp.lib") namespace FrameworkMi

Android中生成库文件与移除以及导入jar包重复问题

1.项目右键-->properties-->android-->Is library-->Apply 2.在其他项目中就能通过add library引用到该库文件 其他项目导入该库文件后可看到引用的对应jar包: 引用库文件的好处在于可以对源代码进行修改 2.移除,注意不能从硬盘删除 即上面的选项不勾选 3.jar包重复问题 如果项目里有android-surport-v4  导入的jar包也有,则任意删除一份 否则报如下错误,通过log可看出是通过sha-1算法来验证两个jar包

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

#设置CMAKE最低版本 CMAKE_MINIMUM_REQUIRED(VERSION 2.8) #设置项目名称 SET(PROJECT_NAME Image_Test_01) #建立项目 PROJECT(${PROJECT_NAME}) #寻找OpenCV库 FIND_PACKAGE(OpenCV REQUIRED) INCLUDE_DIRECTORIES(${OpenCV_INCLUDE_DIRS}) #打印调试信息 MESSAGE(STATUS "Project: ${PROJECT_NA

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

JNI是java语言提供的Java和C/C++相互沟通的机制,Java可以通过JNI调用本地的C/C++代码,本地的C/C++的代码也可以调用java代码.JNI 是本地编程接口,Java和C/C++互相通过的接口.Java通过C/C++使用本地的代码的一个关键性原因在于C/C++代码的高效性. NDK是一系列工具的集合 .它提供了一些列的工具,帮助开发者快速开发C/C++的动态库,并能自动将so和java应用一起打包成apk.它集成了交叉编译器,并提供了相应的mk文件隔离CPU,平台,ABI等

产生java的动态库文件so的配置步骤

我们在安装环境的时候安装了NDK,可以在eclipse下直接生成so文件.NDK的压缩包里面自带了一些sample工程,NDK的文件直接解压到某个目录下即可. 第一次生成so文件的时候,我们先使用NDK的sample下的hello-jni的例子. 1.启动eclipse,通过Create project  from existing source,选择hello-jni的目录,按默认选项创建工程即可: 2.观察hello-jni的工程目录结构,发现根目录下多了一个名叫jni的文件夹,该文件夹下面

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

本文基于OpenBlas的编译和安装.来说明怎样从一个dll文件生成lib库文件. 參考OpenBlas的说明"Howto generate import library for MingW",和MinGW的说明HOWTO Create an ImportLibrary for a DLL using MinGW,学习怎样生成lib库.当中OpenBlas的说明讲的是怎样使用Visual studio的lib.exe工具从dll生成lib文件,而MinGW讲的是怎样把一个windows

Windows下生成dump文件方法

[转载请注明出处]:http://blog.csdn.net/longlong530 一. 背景 没人能保证自己的软件在各种未知环境运行下,会木有任何问题.那么如果程序崩溃了怎么办?看日志?日志不全又怎么办?日志能帮你定位的多细致呢?如果能有种方法记录程序最后工作的状态,比如堆栈调用情况等,那么我们就可以获悉"它是如何挂掉的~" 二. 调研 我们对程序bug引起的程序崩溃的五种定位方法进行了调研,并最终选择方案5为我所在项目使用的程序崩溃定位方案. 方案1: 崩溃地址 + MAP文件

windows 运行库与dll文件

Windows 10包含版本 win10家庭版win10专业版win10教育版win 10企业版 Windows 7包含6个版本分别为Windows 7 Starter(初级版)Windows 7 Home Basic(家庭普通版)Windows 7 Home Premium(家庭高级版)Windows 7 Professional(专业版)Windows 7 Enterprise(企业版)Windows7 Ultimate(旗舰版) 这不是很正常吗,既然是新装的系统,那必然没有安装VC++..