1.包含目录&附加包含目录
头文件.h的索引目录,可以通过此目录完成.h文件的索引。
1.1区别和作用
作用:预编译会从该目录查找
头文件
,可以直接#include<该目录中的头文件>.区别:
- 头目录搜索的优先级不同,顺序:1、源文件目录–>2、附加包含目录–>3、包含目录
- 包含目录:修改了系统的include宏的值,是全局的;
- 附加包含目录:用于当前项目,对其他项目没有影响。
编译器搜索头文件顺序:
1. 如果#include使用双引号(“”)形式,它将首先搜索本地目录。先从包含#include语句的当前文件的所在目录开始搜索。若果失败,则从当前目录的父目并逐级往上搜索,直到最上层include文件所在的目录。
2. 如果#include使用尖括号(<>)形式,或者使用双引号形式本地目录检索失败,它会按照/I选项(附加包含目录)指定的目录搜索。顺序是按照CL在命令行中遇到它们的顺序。
3. INCLUDE环境变量指定的目录,即包含目录。
所以,对本项目自身的#include
一定要用双引号
,否则如果用尖括号,不会搜索本地目录,而是直接从附加包含目录开始搜索,自然就找不到本地的文件,然后报错。
1.2 设置路径
包含目录(Include Directories)
配置属性 → VC++目录 —>包含目录
C:\Users\gdgqwang\Desktop\算法模块化\CalculateFOVP_1Cross\CalculateFOVP_1Cross
附加包含目录(Additional Include Directories)
配置属性 → C/C++ → 常规 —>附加包含目录
2 库目录/ 附加库目录
寻找.lib文件的搜索目录(不是寻找DLL的搜寻目录)
2.1用途
作用:指明库文件所在的目录or路径,即寻找
.lib
文件的搜索目录
区别:优先级不同,先检索附加库目录,再检索库目录
2.2 设置路径
库目录(Library Directories)
位于:配置属性→ VC++目录→ 库目录
附加库目录(Additional Library Directories)
位于:配置属性→ 链接器→ 常规→ 附加库目录
3 附加依赖项
lib库(C++的库会把函数、类的声明放在*.h中,实现放在*.cpp或*.cc中。编译之后,.cpp,.cc,*.c会被打包成一个.lib文件,这样可以保护源代码)
3.1用途
作用:指明依赖库文件的名称
3.2 设置路径
位于:配置属性 → 连接器 → 输入
Debug模式下选择带_d的lib,发布的时候需要改成相应的release不带_d的
oraocci19d.lib
3.3注意运行库的设置
4 静态链接库生成与调用方法
4.1 生成
第一步:创建工程--win32项目--My_Static_lib_1
第二步:选择静态库,预编译头和安全开发生命周期(SDL)检查选择不要
第三步:编写头文件static.h
#ifndef STATIC_H //防止头文件重定义
#define STATIC_H
int sum(int m, int n);
#endif
第四步:编写源文件 static.cpp
#include "static.h"
int sum(int m,int n)
{
return m + n;
}
第五步:生成解决方案
之后你会在工程的release目录下发现生成了一个静态库 :My_Static_lib.ib
4.2 调用
-(1) 要使用一个静态库,除了要include其头文件以外(附加包含目录),还要在链接过程中把lib加进去(附加库目录、附加依赖项)。
-(2)附加包含目录、附加库目录、附加依赖项的添加方法及说明:
① 附加包含目录—添加工程的头文件目录:
项目->属性->配置属性->C/C+±>常规->附加包含目录:加上头文件的存放目录;
② 附加库目录—添加文件引用的lib静态库路径:
项目->属性->配置属性->链接器->常规->附加库目录:加上lib文件的存放目录;
③ 附加依赖项—添加工程引用的lib文件名:
项目->属性->配置属性->链接器->输入->附加依赖项:加上lib文件名。
-(3)在cpp文件中,添加头文件的引入,include<CalculateFOVP_1Cross.h>,然后可以直接
调用静态库中的函数。
5.动态库链接库调用方法(此时lib文件是dll的引导文件)
5.1 动态库的生成
动态库的生成与静态库十分类似:
第一步:新建项目,win32,win32项目,输入项目名称,例如MakeDll。
第二步:选择“DLL”选项,再点“完成”:
第三步:菜单栏选择”项目“——>”添加新项“,来创建头文件MakeDll.h。
在MakeDll.h中输入以下例子代码:
#ifdef DLL_API //如果已经定义就什么都不做
//nothing to do
#else //否则定义DLL_API
#define DLL_API __declspec(dllexport) //_declspec(dllexport):导出标志
#endif
#include <iostream>
using namespace std;
extern "C" DLL_API int addfun (int a, int b);//导出单独的函数
class DLL_API Point //导出类,其自身所有函数都将被导出,可单独对某些类函数导出
{
private:
float x, y;
public:
Point();
void SetPoint(float a, float b);
void DisPlay();
};
第四步:创建cpp文件:MakeDll.cpp。
在MakeDll.cpp中输入以下例子代码:
#include "MakeDll.h"
int addfun(int a, int b)
{
return a + b;
}
Point::Point()
{
x = 0.0f;
y = 0.0f;
}
void Point::SetPoint(float a, float b)
{
x = a;
y = b;
}
void Point::DisPlay()
{
cout << "x=" << x << endl;
cout << "y=" << y << endl;
}
第五步:菜单栏选择”生成——>生成解决方案“。
此时在MakeDll项目所在目录下的Debug或者release的文件有MakeDll.dll和MakeDll.lib了。生成动态链接库文件OK。
注意:此时的MakeDll.lib文件不是静态库文件,是dll文件的引导文件
5.2隐式调用
隐式调用和静态库的调用方法相同,唯一的区别就是需要把DLL放在工程运行目录下。
// 可以代替在附加依赖项里添加 lib名称 的操作
//#pragma comment(lib,"CalculateFOVP_1Cross.lib") // 表示链接库文件
5.3显示调用
只需要用到DLL文件
// ================显性调用Dll=================
clock_t start, end;
start = clock(); // 开始计时
//使用类型定义关键字typedef,定义指向和Dll
typedef int(*lpCalculateFOVP)(int, int bit, double param[5][2], int, double*, int*,char *);
lpCalculateFOVP CalculateFOVP;
HMODULE hDll = LoadLibrary("../DLL_lib/CalculateFOVP_1Cross.dll");//加载动态链接库到内存
if (hDll != NULL)
{
CalculateFOVP = (lpCalculateFOVP)GetProcAddress(hDll, "CalculateFOVP_1Cross"); //动态获得DLL函数的入口地址
if (CalculateFOVP != NULL)
{
Error = CalculateFOVP(i_ImageHandl, 8, param, sign, FOVPData, o_ImageHandl, o_message);
}
}
else
{
cout << "DLL未加载成功,请检查" << endl;
}
FreeLibrary(hDll); //显式地从内存中把它给卸载
end = clock(); // 计时结束
double enttime = (double)(end - start) / CLOCKS_PER_SEC;
cout << "Total time:" << enttime * 1000 << "ms" << endl;
// ================显性调用结束=================