VC工程项目配置文档格式.docx

上传人:b****6 文档编号:15940210 上传时间:2022-11-17 格式:DOCX 页数:12 大小:144.51KB
下载 相关 举报
VC工程项目配置文档格式.docx_第1页
第1页 / 共12页
VC工程项目配置文档格式.docx_第2页
第2页 / 共12页
VC工程项目配置文档格式.docx_第3页
第3页 / 共12页
VC工程项目配置文档格式.docx_第4页
第4页 / 共12页
VC工程项目配置文档格式.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

VC工程项目配置文档格式.docx

《VC工程项目配置文档格式.docx》由会员分享,可在线阅读,更多相关《VC工程项目配置文档格式.docx(12页珍藏版)》请在冰豆网上搜索。

VC工程项目配置文档格式.docx

输入->

附加依赖项:

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"

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:

loadfunerror\n"

12return-1;

13}

14fun();

生成和使用静态库

生成静态库

选择静态库

静态库项目没有main函数,也没有像dll项目中的dllmain。

创建项目后添加.h文件,添加相应的导出函数、变量或类,如下所示

1#ifndef_MYLIB_H_

2#define_MYLIB_H_

4voidfun(inta);

5

6externintk;

7

8classtestclass

10public:

11testclass();

12voidprint();

13};

14

15#endif

.cpp文件如下

stdafx.h"

2#include"

lib.h"

3#include<

iostream>

4

5voidfun(inta)

6{

7std:

a<

libgen\n"

8}

10intk=222;

11

12testclass:

testclass()

13{

14std:

123\n"

15}

17voidtestclass:

print()

18{

19std:

thisistestcalss\n"

20}

编译工程后就会生成一个.lib文件

使用静态库

需要.h文件,lib文件

(1)设置项目属性--vc++目录--库目录为lib所在的路径

(2)将lib添加到项目属性--链接器--输入--附加依赖项(或者直接在源代码中加入#pragmacomment(lib,“**.lib”))

(3)在源文件中添加.h头文件

然后就像平常一样调用普通函数、类、变量,举例如下:

1#include<

4#pragmacomment(lib,"

lib.lib"

6intmain()

7{

8fun(4);

9std:

k<

std:

endl;

10testclasstc;

11tc.print();

12return0;

【版权声明】转载请注明出处 

三、字符集设置

VC真是一个非常笨,非常不友好的工具,还是这样说,VC(MFC)和现在流行的。

netframeworkjava比起来就想石器时代跟工业时代相比一样!

  接触MFC也有几年了,为了它有过加班、有过熬夜、甚至通宵,代码没有十万行也应该有几万行了。

但是MFC就是这么牛,它牛得不但令新手忘而却步,而且常常令有经验的软件工程师也栽跟斗。

最近由于一个小小的环境设置设置问题花了很多时间,这跟用惯了VC6突然转到VC2005有关,但关键还是VC实在太笨了,它让我在一周内连续两中招次!

  第一次中招是这样的,很简单:

  我不知道VC.net2005默认工程默认设置是采用“Unicode字符集”(UnicodeCharacterSet)的,以前用VC6工程的时候默认是“多字符集”(Multi-ByteCharacterSet)的。

以前也没有用过VC.net2005啊,我一直认为。

net是用来在framework上面编程的,在MFC上编程没有必要打开庞大的。

net2005,把机器弄得像牛拉

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1