VC工程项目配置.docx
- 文档编号:3029247
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:12
- 大小:144.51KB
VC工程项目配置.docx
《VC工程项目配置.docx》由会员分享,可在线阅读,更多相关《VC工程项目配置.docx(12页珍藏版)》请在冰豆网上搜索。
VC工程项目配置
VC工程项目配置
一、VC包含目录、附加依赖项、库目录及具体设置
VS项目中的包含目录、库目录、附加包含目录、附加库目录、附加依赖项均在"项目->属性->配置属性"下进行配置,具体说明如下:
VC++目录:
包含目录:
寻找#include
库目录:
寻找.lib文件的搜索目录
C/C++:
常规->附加包含目录:
寻找#include
链接器:
常规->附加库目录:
寻找.lib文件的搜索目录
输入->附加依赖项:
lib库(C++的库会把函数、类的声明放在*.h中,实现放在*.cpp或*.cc中。
编译之后,*.cpp,*.cc,*.c会被打包成一个.lib文件,这样可以保护源代码)
常见问题:
1.包含目录和附加包含目录(库目录和附加库目录)的区别:
包含目录:
修改了系统的include宏的值,是全局的;
附加包含目录:
用于当前项目,对其他项目没有影响。
(库目录和附加库目录的区别同上)
2.可知包含目录和附加包含目录(库目录和附加库目录)的区别主要在于全局还是当前,那么当需要对某工程添加这些目录时,通常情况下,都是在附加包含目录和附加库目录中添加的。
3.要使用一个库,除了要include其头文件以外(附加包含目录),还要在链接过程中把lib加进去(附加库目录、附加依赖项)。
4.添加方法:
附加包含目录---添加工程的头文件目录:
项目->属性->配置属性->C/C++->常规->附加包含目录:
加上头文件的存放目录;
附加库目录---添加文件引用的lib静态库路径:
项目->属性->配置属性->链接器->常规->附加库目录:
加上lib文件的存放目录;
附加依赖项---添加工程引用的lib文件名:
项目->属性->配置属性->链接器->输入->附加依赖项:
加上lib文件名。
5.当需要向项目中添加.dll动态链接库时,直接将需要添加的.dll文件拖拽到项目生成的.exe所在的文件夹下即可(项目->属性->配置属性->常规->输出目录,可以看到.exe生成在哪个目录下)。
6.在添加上述几个目录的路径的时候,可以看到$(xxxx),这就是宏了,可以点开右下角的宏查看这些分别代表什么字符串。
二、lib和dll的区别、生成以及使用详解
首先介绍一下静态库(静态链接库)、动态库(动态链接库)的概念,首先两者都是代码共享的方式。
静态库:
在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。
即静态库中的指令都全部被直接包含在最终生成的EXE文件中了。
在vs中新建生成静态库的工程,编译生成成功后,只产生一个.lib文件
动态库:
动态链接库是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。
动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。
函数的可执行代码位于一个DLL中,该DLL包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。
在vs中新建生成动态库的工程,编译成功后,产生一个.lib文件和一个.dll文件
那么上述静态库和动态库中的lib有什么区别呢?
静态库中的lib:
该LIB包含函数代码本身(即包括函数的索引,也包括实现),在编译时直接将代码加入程序当中
动态库中的lib:
该LIB包含了函数所在的DLL文件和文件中函数位置的信息(索引),函数实现代码由运行时加载在进程空间中的DLL提供
总之,lib是编译时用到的,dll是运行时用到的。
如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll。
以下例子均在vs2010上测试
生成和使用动态库
生成动态库
新建项目--win32项目--填写项目名--确定--下一步--应用程序类型:
选择dll--附加选项:
选择导出符号--完成
可以看到生成了一个dllmain.cpp文件,这是dll应用程序的入口,注意它和普通工程的入口main函数不同,这个文件我们不需要修改。
在这个动态库中我们举例导出一个变量,一个类,一个函数,头文件dll.h如下:
1//新建生成dll的工程时,vs默认定义了宏DLL_EXPORT,因此,DLL_API是__declspec(dllexport),用来导出
2//当我们在静态调用dll时,我们包含该头文件,由于没有定义DLL_EXPORT,所以DLL_API是
3//__declspec(dllimport),用来导入
4#ifdefDLL_EXPORTS
5#defineDLL_API__declspec(dllexport)
6#else
7#defineDLL_API__declspec(dllimport)
8#endif
9
10//导出类
11classDLL_APICdll{
12public:
13Cdll(void);
14//TODO:
在此添加您的方法。
15};
16
17//导出变量,变量在.cpp文件中定义
18externDLL_APIintndll;
19
20//导出函数,加extern"C",是为了保证编译时生成的函数名不变,这样动态调用dll时才能
21//正确获取函数的地址
22extern"C"DLL_APIintfndll(void);
dll.cpp文件如下:
1#include"dll.h"
2
3
4//这是导出变量的一个示例
5DLL_APIintndll=6;
6
7//这是导出函数的一个示例。
8DLL_APIintfndll(void)
9{
10return42;
11}
12
13//这是已导出类的构造函数。
14//有关类定义的信息,请参阅dll.h
15Cdll:
:
Cdll()
16{
17return;
18}
调用动态库
有两种方法调用动态库,一种隐式链接,一种显示链接。
调用动态库:
隐式链接
隐式链接需要.h文件,dll文件,lib文件
(1)将dll放到工程的工作目录
(2)设置项目属性--vc++目录--库目录为lib所在的路径
(3)将lib添加到项目属性--链接器--输入--附加依赖项(或者直接在源代码中加入#pragmacomment(lib,“**.lib”))
(4)在源文件中添加.h头文件
然后就像平常一样调用普通函数、类、变量
调用动态库:
显示链接
显示链接只需要.dll文件,但是这种调用方式不能调用dll中的变量或者类(其实可以调用类,但是相当麻烦,有兴趣者可参考
显示调用主要使用WIN32API函数LoadLibrary、GetProcAddress,举例如下:
1typedefint(*dllfun)(void);//定义指向dll中函数的函数指针
2HINSTANCEhlib=LoadLibrary(".\\dll.dll");
3if(!
hlib)
4{
5std:
:
cout<<"loaddllerror\n";
6return-1;
7}
8dllfunfun=(dllfun)GetProcAddress(hlib,"fndll");
9if(!
fun)
10{
11std:
:
cout<<"loadfunerror\n";
12return-1;
13}
14fun();
生成和使用静态库
生成静态库
新建项目--win32项目--填写项目名--确定--下一步--应用程序类型:
选择静态库
静态库项目没有main函数,也没有像dll项目中的dllmain。
创建项目后添加.h文件,添加相应的导出函数、变量或类,如下所示
1#ifndef_MYLIB_H_
2#define_MYLIB_H_
3
4voidfun(inta);
5
6externintk;
7
8classtestclass
9{
10public:
11testclass();
12voidprint();
13};
14
15#endif
.cpp文件如下
1#include"stdafx.h"
2#include"lib.h"
3#include
4
5voidfun(inta)
6{
7std:
:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 工程项目 配置
![提示](https://static.bdocx.com/images/bang_tan.gif)