zoukankan      html  css  js  c++  java
  • vc++ win32项目属性介绍(二、c/c++)

    常规-附加包含目录这个很常用的了.如果自己以前写过一些库,可以重用,那么就把那个库所在的位置放进来。然后在工程里#include就可以了。
    但这个库所放的位置最好能规范一些。比如放到工程目录上一级,并命名为src、lib这样的。在附加包含目录里,用相对地址和vs内置的宏来描述。切忌绝对路径、切忌放到不同的本地磁盘上。
    常规-调试信息格式
    说一下/ZI和/Zi
    如果允许的情况下,或者在编译成发布版本前,能用ZI就用ZI。但ZI会阻止编译器的一些优化。
    发布版本使用/Zi,编译器会进行一些优化。
    /ZI和/Zi有啥区别?
    在用Zi时,命中一个断点后:
    1.png 

    这时编辑代码,增加一行语句,并继续执行:
    2.png 



    新增加的代码并不能直接运行,程序仍然按照旧代码执行。
    如果改为/ZI后:
    3.png 


    同样增加一行代码,并继续执行:
    4.png 


    程序就按照新代码执行了。这有点类似于java的热替换,不过vc又重新编译了一遍代码。
    调试程序时,这个功能很好用的。
    常规-警告等级
    分为五个等级。一般应用层的程序,W3就差不多够了。如果是内核程序,这个就要求比较高了。
    常规-将警告视为错误
    有警告出现时当做错误处理。使用这个选项来严格要求自己是个好习惯,但我是受不了....内核开发这个是默认打开的。


    5.png 

    因为没有使用i的警告,导致编译错误。
    另外,如果开启这个选项,比如用strcpy什么的,也会报错,编译器会推荐用strcpy_s这类的安全函数。

    优化-优化
    这个选项是和调试信息格式选项有关的。/ZI和优化冲突。
    不同的优化规则会导致编译出来的文件大小有变化。
    貌似release和debug编译出来文件大小的主要区别就是在这里。

    优化-内联函数展开
    如果启用优化时,会把内联函数展开。包括自己定义的内联、头文件中声明的函数、和编译器认为可以作为内联的。
    不过不是我们定义一个inline函数,编译器就一定当成inline处理的。内联函数里不能有循环、不能超过20行(不知道这个数字记错没)。

    预处理器-预处理器定义
    在这里定义一些和系统相关的宏。在调用编译器进行编译之前执行。
    http://www.cnblogs.com/whiteyun/archive/2011/07/07/2099918.html
    这里有详细的预处理指令。

    语言-OpenMP支持
    多核编程支持。打开OMP支持后,一个简单的程序:

    7.jpg 


    将for循环拆分成了多个任务。
    适当的使用多核编程可以提高程序执行效率,但一定要注意数据保护和同步。

    代码生成-基本运行时检查
    检查堆栈和未初始化的变量。常规程序当然推荐全开,但有些比较特殊的程序,比如栈溢出测试,就要关掉堆栈检查了。

    代码生成-运行库
    在第一篇文章里介绍常规-MFC的使用时,提到过这个。
    MD是使用动态库、MT是使用静态库。是VC API和CRT的库,不是MFC。
    如果使用MD编译的程序,在另一个系统里不能运行。使用Depends查看发现有函数未知。那么就是动态编译的问题了。改成MT或者能成功。
    选项后面带d的是debug版本,不带d的是release版本。debug版本会链接有调试信息的库。

    预编译头
    大工程里,使用预编译头会加快编译。多线程编译是很爽很快的。

    高级-调用约定
    网上关于_cdecl/_stdcall/_fastcall/_thiscall这些的解释很多,就不说了。这个就是控制默认函数声明时,采用何种调用约定生成的。
    调用约定主要是对于函数名称、堆栈平衡维护位置、使用寄存器优化等起作用的。
    写dll时比较在乎这个,不过一般都是放到模块定义文件里的。

    高级-编译为
    使用c编译器还是c++编译器。如果工程源文件是.c会自动使用c编译器,.cpp会使用c++编译器。
    另外,再百度查查extern C吧。
    c++编译器编译函数时,除了遵循调用约定外,还会在函数后面加些编码。

    命令行
    就是所有在使用的编译选项。

  • 相关阅读:
    linux查看文件有多少行(WC)
    MYSQL -- 联合索引
    MySQL -- 调优
    MySQL
    Linux命令执行的屏幕输出内容重定向到日志文件
    golang日期时间格式format()
    scp遇到路径中有空格
    查看服务器的网络吞吐
    SQL中关于where后面不能放聚合函数(如sum等)的解决办法
    gearman kubernetes 运行
  • 原文地址:https://www.cnblogs.com/raymon/p/2829986.html
Copyright © 2011-2022 走看看