目录
包含目录/附加包含目录
1. 区别和作用
2.编译器搜索头文件顺序
库目录/ 附加库目录和附加依赖项
库目录/ 附加库目录
附加依赖项(会在前面的附加库目录中搜索)
静态链接器和动态链接器的调用
1.静态链接库的调用
2.动态链接库的调用
总结
包含目录/附加包含目录
配置属性 → VC++目录 → 包含目录
配置属性 → C/C++ → 常规 → 附加包含目录
#include < .h>中 .h的搜索目录。如果有XXX.h找不到,设置这个目录可以解决。
1. 区别和作用
作用:预编译会从该目录查找头文件(.h),可以直接#include<该目录中的头文件>.
区别:
最大的不同仅仅是在于编译器寻找头文件的优先级不同;包含目录:修改了系统的include宏的值,是全局的;附加包含目录:用于当前项目,对其他项目没有影响。
2.编译器搜索头文件顺序
源文件代码所在的文件夹目录(即包含文件)在使用MSVC编译的时候,通过参数 /I 来指定的搜索目录;(相当于是“附加包含目录”设置的)通过 INCLUDE 环境变量指定的搜索目录;(相当于是“包含目录”设置的)
如果#include使用双引号(“”)形式,它将首先搜索本地目录。现从包含#include语句的当前文件的所在目录开始搜索。若果失败,则从当前目录的父目并逐级往上搜索,直到最上层include文件所在的目录。如果#include使用尖括号(<>)形式,或者使用双引号形式本地目录检索失败,它会按照/I选项( /I 是由 C/C++ -> 常规-> 附加包含目录设置的)指定的目录搜索。顺序是按照CL在命令行中遇到它们的顺序。INCLUDE环境变量指定的目录,即包含目录。
所以,对本项目自身的#include一定要用双引号,否则如果用尖括号,不会搜索本地目录,而是直接从附加包含目录开始搜索,自然就找不到本地的文件,然后报错。
库目录/ 附加库目录和附加依赖项
配置属性→ VC++目录→ 库目录
配置属性→ 链接器→ 常规→ 附加库目录
配置属性 → 链接器 → 输入→附加依赖项
1.库目录/ 附加库目录
用 #pragma comment(lib,"a.lib")的时候;此时就搜索a.lib的路径列表就包含这个路径。(把lib所在的目录添加到库目录里面就是告诉IDE, 搜索没有指定路径的库文件时,也搜索这里。)
作用:指明库文件所在的目录or路径,即寻找.lib文件的搜索目录。区别:编译器寻找库文件的优先级不同,先检索附加库目录,再检索库目录。
MSVC编译器寻找库文件(主要是指静态库,因为在编译的时候只需要静态库,动态库是在运行的时候才需要的)的顺序:
源文件代码所在的文件夹中寻找库文件(即静态库文件);在使用MSVC编译的时候,通过参数 /link 来指定的搜索目录;(相当于是“附加库目录”设置的)通过 LIB 环境变量指定的搜索目录;(相当于是“库目录”设置的)
2.附加依赖项(会在前面的附加库目录中搜索)
指明依赖库文件的名称,如某个lib库(C++的库会把函数、类的声明放在*.h中,实现放在*.cpp或*.cc中。编译之后,.cpp,.cc,*.c会被打包成一个.lib文件,这样可以保护源代码)。
静态链接器和动态链接器的调用
1.静态链接库的调用
需要.h文件,lib文件.
(1)添加工程的头文件目录:项目→属性→配置属性→C/C++→常规→附加包含目录:加上头文件的存放目录;
(2)添加文件引用的lib静态库路径:设置项目→属性→配置属性→链接器→常规→附加库目录为lib所在的路径;
(3)添加工程引用的lib文件名:将lib添加到项目属性→链接器→输入→附加依赖项(或者直接在源代码中加#pragmacomment(lib,“**.lib”))
(4)在源文件中添加.h头文件
2.动态链接库的调用
隐式调用:在生成动态链接库dll后,还会生成一个静态链接库lib文件,隐式调用时需要dll和lib两种文件,步骤如下:
将dll放到:可执行程序所在目录、Windows目录:C:\windows\、系统目录:C:\windows\System32或是C:\windows\System都可以。设置项目属性--vc++目录--库目录为lib所在的路径将lib添加到附加依赖项(或者直接在源代码中加入#pragma comment(lib, “**.lib”))在源文件中进行调用函数的声明 如:_declspes(dllimport) int Add(int a ,int b);之类。如果有头文件可以直接将头文件添加进源文件中也可。
显示调用:有时只有一个dll文件,这时就需要显式调用动态链接库,显式调用主要使用WIN32 API函数LoadLibrary、GetProcAddress,举例如下:
// TestSampleLib.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include "windows.h"
typedef int(*lpAddFun)(int,int);//定义函数指针类型
int _tmain(int argc, _TCHAR* argv[])
{
HINSTANCE hDll;
lpAddFun addFun;
hDll=LoadLibrary(L"SampleLib.dll");//加载动态链接库
if(hDll!=NULL)
{
addFun=(lpAddFun)GetProcAddress(hDll,"add");//获得指定动态链接库中特定函数地址指针。
if(addFun!=NULL)
{
int result=addFun(2,3);//调用动态链接库中的函数。
printf("2+3=%d",result);
}
}
getchar();
FreeLibrary(hDll);//卸载动态链接库
return 0;
}
总结
配置环境时主要配置的三样东西:
头文件包含路径:即所谓的 包含目录 或者 附加包含目录;库文件路径:即所谓的 库目录 或者 附加库目录;库文件的名称:附加链接库。
一般建议使用 C/C++和链接器 下面的设置,而不建议使用 VC++目录 下面的设置,可能的原因是因为前者的搜索顺序在前面,所以优先使用,而且不需要环境变量,但是对于VS来说,个人感觉差别不大。
推荐链接
大家都在找:
笔记:笔记怎么做
c++:c++ 尺取法
windows:windows官网
发表评论