动态链接库项目的创建:
- 首先要看看官方网站给出的详细介绍如何 创建和引用dll动态链接库项目。这个链接中将创建dll的项目和使用dll的项目放在同一个solution当中。
导出类的写法
- 当你把VC++项目设置为DLL项目的时候,项目会自动定义一个宏(在C++/Preprocessor里):项目名__EXPORTS。例如:COMMUNICATER_103_EXPORTS
- 使用用上面的宏定义导出符号:
#ifndef COMMUNICATER_H
#define COMMUNICATER_H
//#include "ace/ACE_export.h"
#ifdef COMMUNICATER_EXPORTS
#define COMMUNICATER_API __declspec(dllexport)
#else
#define COMMUNICATER_API __declspec(dllimport)
#endif
class COMMUNICATER_API Communicater
{
public:
Communicater(void);
virtual void run_collect() = 0;
virtual ~Communicater(void);
};
#endif
动态链接库的加载三部曲
1 加载头文件 "fun.h"目录
附加路径:C/C++ -> General -> Additional Include Directories设置相对路径。
比如: ../Include
注意: 相对路径添加资源文件:相对路径的起点是项目文件夹(即source file的路径即.vcxproj所在路径)
代码写成:#include "file.h"
常用的路径包括:$(SolutionDir)
此宏定义包含了路径末尾的“\”,所以你一般会写:$(SolutionDir)lib\ (注意第一个路径之间没有\分隔符,但第二个有)
2 添加库文件 lib
2.1 lib文件目录
配置属性》链接器》常规》附件库目录》添加$(ACE_ROOT)/lib
2.2 lib文件
“右键项目名”--properties(或者点击菜单:“project”--“properties”)--"configurationg and properties"--”linker“--”input“--"additional dependencies" 输入lib文件全名fun.lib,这是为了让编译器构建项目时链接dll用于引导使用
3 加载动态链接库文件
"fun.dll"
此文件和fun.lib放到同一个目录里即可。
注意:因为dll,lib文件可以是不同的编译器版本制作出来的,在运行时要求也不同。有些功能只需要1(boost中的lexical库等,因为这些库的实现就在源代码里面);有些需要2(比如boost中的regex等,这些库要求必须只用编译之后的lib库),有些库需要1、2、3(比如ACE、pocketSphinx,因为每次都使用编译器重新编译到代码中太浪费时间了。所以就编译好了包含lib,dll即可)