目录

包含目录/附加包含目录

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来说,个人感觉差别不大。

推荐链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: