vs c++ 多项目开发

项目依赖项:项目所依赖的项目,项目a依赖b,编译a之前会先编译b,但是两个项目不能相互依赖。多项目时,编译整个工程默认只编译启动项目,因为有了项目依赖项,其他的项目也会被编译。

预编译头:cpp中将所有的include展开再进行编译,会大大降低编译速度,因此将所有的include单独拿出来只编译一次,就会提高编译速度。将项目中所有的include放在一个头文件,由于编译器只能编译cpp,因此要再建一个cpp包含该头文件,对该cpp进行预编译头的创建,项目中其他的cpp再进行预编译头的使用。
注意:设置了预编译头之后,其它cpp都必须包含预编译头,且是第一个被包含(头文件中无需包含)。

__declspec(dllexport)与__declspec(dllimport):
都是dll中的关键字,他们将dll内部的函数、类等导出与导入。
导出(动态库):在函数、类和变量声明时,__declspec(dllexport)写在函数、类或者变量名的前面,那么在项目之外也可以访问他们的具体细节(项目外可以使用这些函数、类等),外部项目具有访问项目生成的dll的权利。
导入:__declspec(dllimport)导入其他项目的函数、类等时用到,在其他项目中必须有__declspec(dllexport)才能用__declspec(dllimport),不用__declspec(dllimport)也能编译成功,但是加上__declspec(dllimport)会让编译器更好的生成代码,建议使用__declspec(dllimport)。

预编译指令:
#define 定义一个预处理宏
#undef 取消宏的定义

#if 编译预处理中的条件命令,相当于C语法中的if语句
#ifdef 判断某个宏是否被定义,若已定义,执行随后的语句
#ifndef 与#ifdef相反,判断某个宏是否未被定义
#elif 若#if, #ifdef, #ifndef或前面的#elif条件不满足,则执行#elif之后的语句,
相当于C语法中的else-if
#else 与#if, #ifdef, #ifndef对应, 若这些条件不满足,则执行#else之后的语句,
相当于C语法中的else
#endif #if, #ifdef, #ifndef这些条件命令的结束标志.
defined  与#if, #elif配合使用,判断某个宏是否被定义
使用:
条件编译:
#ifndef HEAD_H
#define HEAD_H
#endif // !HEAD_H

功能与#pragma once类似,但是#pragma once的移植性差,源文件中只会包含同一个头文件一次。a包含b,c同时包含a和b,没有条件编译就会出现多次声明的问题。
注意:头文件中尽量不要去定义变量,因为同一项目中多个cpp包含同一个头文件就会出现重定义的问题,这和条件编译没关系。
dll导出与导入:
#ifdef DLL_EXPORTS
#define DLLAPI __declspec(dllexport)
#else
#define DLLAPI __declspec(dllimport)
#endif

在导出的项目头文件中加上上面的代码,导出项目中加入预处理器定义(宏):DLL_EXPORTS,宏DLLAPI就是__declspec(dllexport);导入项目中不用加入,宏DLLAPI就是__declspec(dllimport)。

c++头文件包含:
头文件中尽量少包含头文件。原因是头文件a包含了头文件b,其项目属性中设置了包含路径,而另外一个项目中的头文件c包含了a,而其项目属性中往往忘了加头文件b的包含路径,因此就会搜索不到头文件b。
头文件是不需要被编译的,即使一个有语法错误而没有被包含的头文件(具有Q_OBJECT的qt头文件例外),也不会出错,其只是起到了单纯的替换的作用,包含头文件的源文件包含头文件需要的include即可(具有Q_OBJECT的qt头文件例外)。
源文件需要两个头文件a和b,其中a需要b中的东西,则b的包含一定要先于a的包含。

多项目开发:
1.将非启动项配置属性改为dll

2.调试的时候,只会生成启动项目,非启动项目是默认不会生成的,因此要在解决方案属性中设置项目依赖项,这样启动项目依赖项会比启动项目先生成。

3.把函数接口导出到dll中
在头文件中加入:
#ifdef DLL_EXPORTS
#define DLLAPI __declspec(dllexport)
#else
#define DLLAPI __declspec(dllimport)
#endif
在导出项目中添加预处理器:DLL_EXPORTS
在需要导出的函数名或类名前加上DLLAPI
4.为导入项目添加包含路径、库目录和附加依赖项 ,就可以在项目中使用别的项目的接口了。

注意:
error LNK2019: 无法解析的外部符号 "__declspec(dllimport):
在项目属性->配置属性–>常规->项目默认值->字符集中设置字符集即可。

dll调试exe:
dll项目,属性-调试- 命令,设置为exe的路径,进行调试即可。
注意:dll当前生成的库文件必须和exe目录下使用的库文件相同,否则不能进行调试。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值