第一次使用visual studio2017生成和调用lib,dll库,小结如下

1. #inlucde添加头文件报错

  • include<>与include “ ”

用#include<>添加头文件是直接从 编译器自带的函数库 和 把路径加入了项目的附加包含目录的文件里 中寻找头文件,用#include" "添加头文件是先从自定义的文件中找,如果找不到再从函数库文件中寻找文件。
因此如果是函数库里的头文件 或 第三方库的头文件,最好用<>,用“ "也可以;但是如果是自定义的头文件,一定只能用“ ”
另注:当 编译器自带函数库、第三方库 和 项目目录下自定义的头文件有重名时,<>使用编译器自带函数库、第三方库;而“”使用自定义头文件(按照搜索顺序理解).

  • 如何在项目中添加头文件
    1.创建的.h文件后,如果与.cpp在头一个文件夹下,在资源管理器的头文件里直接添加现有项目

2.如果.h与现有项目的.cpp不再头一个文件夹下,不能直接通过资源管理器添加,解决办法有三种:
a. 绝对路径引用#include “F://head/add.h”
b. 将add.h所在文件夹的路径添加到项目的附加包含目录中。
c.相对路径引用(适用于在同一个项目但不在同一个文件夹下,相对路径使程序可移植性强)
相对路径指相对cpp文件的路径,而不是相对sln文件的路径。
*.\SRC* 这样写表示,当前目录中的SRC文件夹;
*…\SRC* 这样写表示,当前目录的上一层目录中SRC文件夹;

3.对第三方库(dll,lib)的调用(仅针对本项目,并不影响其他项目的配置):
a.在项目属性C/C++的附加包含目录中添加头文件所在目录
b.在链接器的附加库目录中添加lib所在目录
c.在附加依赖项中,添加要调用的lib的文件名
注:即使是调用动态链接库dll,也不应该在附加依赖项中添加.dll,而只需要添加dll的导出库.lib
d.其实在生成exe文件时只需要lib文件,相当于告诉了exe需要调用的dll的入口。只有在真正运行exe时才需要dll

4.动态链接库的生成
a. 新建项目-dll
b.添加.cpp和.h
(其中的头文件的prama once是为了防止重复包含头文件)
c.导出dll要用extern “C” __declspec(dllexport)放在函数声明前
而导入要用extern “C” __declspec(dllimport)放在函数声明前
可以用宏定义将两者统一为同一头文件
#ifdef BLURDETECTION_EXPORTS
#define BLURDETECTION_API __declspec(dllexport)
#else
#define BLURDETECTION_API __declspec(dllimport)
#endif
然后在dll生成项目的属性的C/C++预处理器中定义宏BLURDETECTION_API

d. dll一定要与exe在同一个目录下,否则运行exe时会显示找不到dll
如果要让dll能在其他目录下时运行exe,有如下方法:
1.在系统变量path中添加dll的路径
2.通过SetdllDir等函数添加dll搜索路径
参考链接:

程序加载独立目录下的dll(loadlibraryex,setdlldirectory,setcurrentdirectory用法)
3.将dll放在sys32下,因为dll的搜索路径除了exe所在目录还有sys32

5.预编译头

所谓预编译头,就是把头文件事先编译成一种二进制的中间格式,供后续的编译过程使用。预编译头物理上与通常的的.obj文件是一样的,但是千万不要把这个中间格式与. o/.obj/.a/.lib的格式混淆,他们是截然不同的!所以预编译头文件的特性和目标文件也不同(尽管他们都属于某种中间文件)。编译入预编译头的.h,.c,.cpp文件在整个编译过程中,只编译一次**,如预编译头所涉及的部分不发生改变的话,在随后的编译过程中此部分不重新进行编译。**进而大大提高编译速度,并便于对头文件进行管理,也有助于杜绝重复包含问题。

设置预编译头文件:在预编译头里添加头文件
参考链接:stdafx.h

你可能感兴趣的:(C++)