VS2010项目配置详解

首先看一下项目设置中可以使用的宏(环境变量),常用的有:


ConfigurationName

配置名字,通常是Debug或者Release

IntDir

编译器使用的中间目录,产出obj文件

OutDir

链接器使用的输出目录

ProjectDir

项目目录

ProjectName

项目名字

SolutionDir

解决方案目录

TargetDir

目标输出文件所在的目录

TargetExt

目标输出的扩展名

TargetFileName

目标输出文件名,包括扩展名

TargetName

目标输出名,不包括扩展名

TargetPath

目标输出文件的全路径名

下图是某一个工程所有设置的例子:


注意:从上图可以看出,TargetDir指目标目录,是一个目录。而TargetPath是目标路径,包括具体的文件名


vs2010使用方案管理项目,一个解决方案下可包含多个项目。

默认情况下,项目属性的设置的目录起点为项目配置文件所在的位置,实际上就是项目头文件和源文件所在的位置。

vs2010中默认建立C++项目,则解决方案总目录下包含一个sln和一个项目文件夹,在vs2010编译器中生成debug和release解决方案后,总目录下还会生成对应的debug和release目录,存放最终生成的exe或dll文件,同时也会在项目文件夹下生成debug和release目录(存放的是中间编译文件obj)。

下面结合例子讲一下:solution为创建的解决方案,demo为创建的项目

解决方案solution总目录如下:

项目demo目录如下:

 

项目配置及系统变量关系:

在vs2010的项目属性页,会有一些系统变量,如下:

SolutionDir:解决方案目录

Configuration:指debug或release

ProjectName:项目名字

OutDir:在 常规--输出目录 中定义的值,如$(SolutionDir)$(Configuration)\,表示XXX\lolution\debug\目录值

IntDir:中间目录

TargetDir:生成exe或dll文件所在位置,如链接器-常规-输出文件为$(OutDir)$(TargetName)$(TargetExt)(即定义了exe输出位置,也就决定了TargetDit的值),此时TargetDir表示在XXX\lolution\debug\

TargetName:目标输出名,不包括扩展名

TargetPath:目标输出文件的全路径名

ProjectDir:表示项目目录值,一般在“调试-工作目录”中设置该值

TargetExt:扩展名

PlatformToolsetVersion:

ConfigurationName:配置名字,通常是Debug或者Release

默认情况下“输出目录”和“输出文件”对应的目录值是一样的。

 

配置属性

             常规

                      输出目录:$(SolutionDir)$(Configuration)\     //即

                      中间目录:$(Configuration)\ 

                      目标文件名:$(ProjectName)

                      目标文件扩展名:.exe

                      生成日志文件:$(IntDir)\$(MSBuildProjectName).log

            调试

                     命令:$(TargetPath),表示调试器要启动的exe全名,TargetPath就表示目标输出文件的全路径名,所以一般情况下它代表的值就等于“输出文件”属性代表的值

                     工作目录:$(ProjectDir)

C/C++

          预编译头

                    预编译头输出文件:$(IntDir)$(TargetName).pch

          输出文件

                    ASM列表位置:$(IntDir)

                    对象文件名:$(IntDir)

                    程序数据库文件名:$(IntDir)vc$(PlatformToolsetVersion).pdb

          浏览信息

                    浏览信息文件:$(IntDir)

链接器

          常规

                    输出文件:$(OutDir)$(TargetName)$(TargetExt)

         清单文件

                   清单文件:$(IntDir)$(TargetName)$(TargetExt).intermediate.manifest

         调试

                  生成程序数据库文件:$(TargetDir)$(TargetName).pdb

         优化:

                  按配置优化数据库:$(TargetDir)$(TargetName).pgd



由上面叙述可以总结出,管理器(解决方案或项目)都会对应一个总的文件夹,这个管理器文件夹下存放本管理器的配置文件以及子管理器。比如,解决方案是个管理器,它的文件夹下含有.sln配置文件以及子管理器ssyy项目和子管理器ssyy2项目。

另外,默认情况下,项目属性设置的目录起点为项目配置文件所在位置,实际上就是项目头文件和源文件所在位置。

补充:vs中建立默认的C#项目和建立默认的C++项目生成的目录结构是不一样的。如果是C#项目,则解决方案总文件夹下就只包含解决方案配置文件sln和一个项目总文件夹(共两个东东),而项目总文件夹下包含c#源文件、项目配置文件proj、一个Properties属性文件夹、一个obj文件夹和一个bin文件夹,其中obj和bin文件夹下都包含debug和release两个文件夹。obj文件夹下存放中间编译结果(扩展名更加项目类型而不同),而bin文件夹下存放最终生成的结果(扩展名一般为exe或dll)。

而如果是C++项目,则解决方案总文件夹下就只包含解决方案配置文件sln和一个项目总文件夹和一个Debug文件夹以及一个Release文件夹(共四个东东,其中Debug和Release文件夹中存放最终生成的结果exe或dll,要注意如果不使用Release生成,则不存在Release文件夹),而项目总文件夹下包含C++源文件头文件、项目配置文件和一个Debug文件夹以及一个Release文件夹(一定要注意,此处的Debug和Release文件夹仅仅存放中间编译结果obj,不存放exe和dll之类的东西。如果不使用Release编译,则没有对应的Release文件夹)。

由此可见,c#项目默认生成的文件目录结构更合理,且输出的exe位于总项目文件夹内,而c++项目默认exe位于解决方案总文件夹下。另外c#更合理在,C#使用Bin目录,在Bin目录下包含debug和release两个目录,而C++不使用Bin目录,直接使用debug和releae两个目录。

 

其次,常用项目属性和系统配置变量关系:

         如果我们建立一个默认的vc项目ssyy,他的默认“常规“栏目中,“输出目录”为$(SolutionDir)$(ConfigurationName),所以调试时会在解决方案文件夹下建立一个debug(ConfigurationName的值为debug)文件夹,并在此文件夹下生成 ssyy.lik链接器 和ssyy.exe文件 。默认“中间目录”为$(ConfigurationName),所以会在ssyy项目文件夹下(即ssyy.vcproj的项目配置文件所在位置)建立一个debug文件夹,并在该文件夹下生成ssyy.obj二进制文件。默认“链接器”栏目下的“常规”选项下的“输出文件”选项为$(OutDir)\$(ProjectName).exe,其中$(OutDir)就已经在“常规”栏目的“输出目录”选项赋值了。【所以$(OutDir)的值是在“输出目录”属性中定义的】。

        另外,经过实际测试,发现“输出目录”属性只能起到对$(OutDir)系统变量赋值的作用,和“改变生成的.exe文件存放位置”没任何关系。也就是说,如果“输出目录”中设置的$(OutDir)值在C盘,而“输出文件”中设置输出文件的位置为D盘,最终生成的exe文件会在D盘,“输出文件”属性才决定输出exe文件的位置。

        而$(TargetDir)的值是在生成exe文件后自动赋予值为exe文件所在位置。所以可以说,“输出文件”最终决定exe文件所在的位置,也最终决定了$(TargetDir)的值,$(TargetPath)和$(TargetDir)的行为是类似的,此不赘述。

        上面两段说了这么多,总结就是,默认情况下“输出目录”和“输出文件”两个属性对应的目录是一样的,这样用着方便(当然,输出文件的值在输出目录的值的基础上还包含有exe文件名)。如果两个不一样,则中间生成的链接器用的如xx.ilk和xx.pdb文件等在输出目录,而最终生成的xx.exe文件在“输出文件”属性设置的目录中。

另外,上面两段话可以总结出,当调试程序时,系统变量$(OutDir)的值是最先确定的,而$(TargetDir)和$(TargetPath)的值是在exe文件生成后才确定的。也就是说系统变量$(OutDir)的值由VS项目的“输出目录”属性决定,而$(TargetDir)和$(TargetPath)的值由VS项目的“输出文件”属性决定。即设置了VS的“输出目录”属性就相当于设置了$(OutDir)的值,“输出目录”是界面上的提示用于接收用户输入的配置信息,然后把这个具体的配置信息存入系统内容的变量$(OutDir)中。

其它常用的属性还有,“调试”栏目中的“工作目录”项,这个属性默认情况下是空的,但表示工作目录是工程目录,也就是工程配置文件ssyy.vcproj所在目录。工作目录表示进行某项操作的目的目录,会随着OpenFileDialogSaveFileDialog等对象所确定的目录而改变。“工作目录”属性作用是程序运行后唯一识别的默认目录,即工作后只认识这个目录,工作目录这个名字描述的就很形象,(可以将所依赖的libdll库文件所在目录设为工作目录,但一般是把lib放在解决方案下的Lib目录中,把dll放在解决方案下的Bin目录中),例如程序运行过程中生成一个txt文本文件,如果在创建文件过程中未指定绝对路径,只指定创建文件的文件名,那么这个文本文件默认就会建立在工作目录中,当然读取一些配置文件也在工作目录中查找,但要说明一下,生成的exe文件跟工作目录没任何关系,也不会放在工作目录中。总的来说,工作目录就是程序运行过程中默认读取的目录。对于dll,如果是程序运行前就进入内存有点像静态链接那样,此时dll就可以放入exe所在的执行目录,如果dll是运行中动态加载的一般放在工作目录,比如插件就放在工作目录。即工作目录就是运行期间唯一能识别的默认目录,工作目录在代码中用GetCurrentDirectory之类的函数获取,具体代码间最下面的附1。工作目录与执行目录可以不同,例如一个人住在北京,但他的工作地点不一定在北京,可能在天津。

对工作目录的补充:vs中工作目录的设置是给调试用的,也即你启动调试后,启动一个新进程,自动把这个新进程的工作目录设置为vs项目属性中的工作目录,然后新进程启动对应的exe程序。但是如果不使用vs的调试启动exe,而是直接双击exe文件启动一个新进程时,会自动把这个新进程的工作目录设置为exe文件所在的目录,这是和vs启动调试不同的地方。所以如果发布的时候不把工作目录内的东西拷到exe所在的目录内,就会运行出错,因为此时工作目录不再是vs中设置的了,而是exe文件所在的目录。最后,说一下,vs中默认的vc++工程的工作目录项目的值是空的,代表默认是vs工程所在目录即.vcproj文件所在目录,c#工程默认没测试,估计和vc的一样。】

【同样在调试选项下的和工作目录选项同一级的选项“命令”选项是设置,使用调试时,从哪里启动exe文件,因为一般生成的exe放在bin目录下的debug或release目录下,所以命令选项一般为“Bin\$(Configuration)\$(ProjectName).exe”,默认也是这个值,当然可以更改,但此时意味着调试状态下启动的exe为“命令”选项中设置的exe文件,而不是默认的bin目录下的debug或release下的exe文件了。最后说一下,上面所说的“调试”是指vs下启动exe,包括debug模式和release模式,不要把调试就理解为只有debug模式。】

 

 “调试”栏目中的“命令(Command)”属性项,【这个属性表示调试器要启动的exe文件的全名】,包括路径名,默认为$(TargetPath),而TargetPath就表示目标输出文件的全路径名,所以一般情况下它代表的值就等于“输出文件”属性代表的值。当然你也可以人为的更改“命令”属性的值,比如更改为c:\aa.exe,而“输出文件”的值为c:\bb.exe,此时如果输出文件所在目录没有aa.exe的话(因链接器只生成bb.exe而根本不会生成aa.exe),调试器就不能启动aa.exe,提示找不到aa.exe。当然如果目录中已经有aa.exe文件(可以强制赋值一个bb.exe文件的副本并命名为aa.exe),此时调试器就可以正常调试通过。

“链接器”栏目下的“输入”选项下的“附加依赖项”项。此项是设置程序链接时使用的静态库。相当于链接已经编译好了的“代码”。由此我们可以简单的认为这些库就相当于我们自己写的.cpp文件,只不过这些库是编译好了的.cpp而已(这里只需要库名称即可,搜索路径在其他地方设置)。

“附加依赖性的设置”等同于在代码中写“#pragma comment(lib, "库名称.lib") ”语句,如果使用相对路径则如下:

#pragma comment(lib,"..\\debug\\TestLib.lib");其中的反斜杠要用双反斜杠,因为它是程序解释的双引号包括的字符串,需要转义一下,要区别include,#include "..\TestVideoApplication.h"中并不是由程序解释的字符串,所以不用转义




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Centos7 下 zabbix服务安装与部署,linux监控服务

客户端安装参考:https://mp.csdn.net/postedit/95475740 安装Zabbix 关闭 SeLinux 临时关闭 setenforce 0 永久关闭 vi /etc/selinux/config 关闭防火墙 临时关闭 systemctl stop firewalld.service 永久关闭 systemctl disable firewalld.service安装基础环…

Zabbix 安装agent

服务端安装参考:https://datamining.blog.csdn.net/article/details/95362947 安装前首先添加对应的yum repository rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm yum install -y zabbix-agent 修改配置文件 …

Bootstrap 导入js文件,浏览器找不到文件问题

html导入文件是用href属性来导入,js利用src属性导入,都可以用相对路径来导入文件,只要确保相对路径正确不会找不到。 绝对路径:是从盘符开始的路径,形如C:\windo绝对路径:是从盘符开始的路径,形…

windows 安装 zabbix agent 客户端

下载window客户端 https://assets.zabbix.com/downloads/3.4.0/zabbix_agents_3.4.0.win.zip 在C盘建立目录 C:/zabbix ,并解压下载文件 修改配置参数 LogFilec:\zabbix\zabbix.log Server服务端ip ServerActive服务端ip Hostnameinstance-2c7t7v(右…

Spark-shell 脚本批量执行命令,命令行批量执行命令

spark-shell 执行脚本&#xff0c;批量执行命令 #!/bin/bashsource /etc/profileexec spark-shell --name spark-sql-test --executor-cores 8 --executor-memory 8g --num-executors 1 --conf spark.cleaner.ttl240000 <<!EOF var startTime System.currentTimeM…

TCP滑动窗口机制

TCP通过滑动窗口机制检测丢包&#xff0c;并在丢包发生时调整数据传输速率。滑动窗口机制利用数据接收端的接收窗口来控制数据流。 接收窗口值由数据接收端指定&#xff0c;以字节数形式存储于TCP报文头&#xff0c;并告知传输设备有多少数据将会存储在TCP缓冲区。缓冲区就是数…

CDH中文文档下载,Cloudera中文手册,CM中文文档

CDH中文文档下载 链接&#xff1a;https://pan.baidu.com/s/1G-8WCafpPZ3p7ZDeXLcgug 提取码&#xff1a;ubxz

运行第一个node.js文件

安装node.js 链接:https://nodejs.org/en/ 选择downloads 再选择对应的版本&#xff0c;Windows Installer (.msi)&#xff1a;表示需要安装后才能运行node.js文件,安装完后在(cmd)控制台输入node -v查看版本&#xff0c;不用配置环境安装完成后自动配置。Windows Binary (.zip…

phoenix-sqlline 连接失败

报错如下 [rootxxx bin]# phoenix-sqlline.py xxx.xxx.xxx:2181:/hbase Traceback (most recent call last):File "/opt/cloudera/parcels/APACHE_PHOENIX-4.14.0-cdh5.13.2.p0.3/bin/../lib/phoenix/bin/sqlline.py", line 25, in <module>import phoenix_ut…

几个重要库函数的实现

面试官很喜欢让求职者写一些常用库函数的实现&#xff0c;有很多是和字符串相关的&#xff0c;有一些是关于内存拷贝的。一般&#xff0c;常会让写的函数有以下几个&#xff1a; strcpy &#xff0c; strncpy&#xff0c; memcpy。 memset一般不会让去写&#xff0c;但这个函数…

CDH 5.13.0 集成 Phoenix

1.下载Phoenix http://phoenix.apache.org/download.html 找到对应版本 点击parcels (cdh可安装版本) http://www.apache.org/dist/phoenix/apache-phoenix-4.14.0-cdh5.13.2/parcels/ 下载好这三个文件 -rw-r--r-- 1 root root 364830720 7月 26 16:15 APACHE_PHOENIX-…

Phoenix 关联hbase表历史数据

Phoenix 基本使用 进入Phoenix phoenix-sqlline.py 10.248.161.18:2181:/hbase 或者进入目录下执行 cd /opt/cloudera/parcels/APACHE_PHOENIX/bin 关联Hbase原有表 创建Hbase表&#xff0c;列簇为 cf1 , cf2 create phoenix_hbase_test,cf1,cf2 插入测试数据 put phoenix…

Phoenix 关联映射 Hbase表 获取不到数据,upsert hbase 列名为16进制字符

创建Hbase表 create phoenix_hbase_test,cf1,cf2 put phoenix_hbase_test, key1,cf1:name,zhangsan put phoenix_hbase_test, key1,cf2:age,18 put phoenix_hbase_test, key2,cf1:name,lisi put phoenix_hbase_test, key2,cf2:age,26 put phoenix_hbase_test, key3,cf1:name,c…

node.js模块和包

概念&#xff1a;模块(Module)和包(Package)是Node.js最重要的支柱。开发一个具有一定规模的程序不可能只用一个文件&#xff0c;通常需要把各个功能拆分、分装、然后组合起来。模块正式为了实现这种方式而诞生&#xff0c;在浏览器JavaScript中&#xff0c;脚本模块的拆分和组…

Ensure that config phoenix.schema.isNamespaceMappingEnabled is consistent on client and server

Phoenix链接异常&#xff0c;报错如下 0: jdbc:phoenix:xxx:2181:/hbase> Error: ERROR 726 (43M10): Inconsistent namespace mapping properties. Ensure that config phoenix.schema.isNamespaceMappingEnabled is consistent on client and server. (state43M10,code7…

Phoenix 关联查询异常 , MaxServerCacheSizeExceededException phoenix.query.maxServerCacheBytes

参数配置说明&#xff1a;http://phoenix.apache.org/tuning.html Join&#xff1a;http://phoenix.apache.org/joins.html 从设计角度来讲&#xff0c;尽可能的不使用phoenix进行关联查询&#xff0c;速度比直接根据条件查询慢很多很多 测试关联&#xff0c;异常如下 Error:…

Phoenix 原理 以及 Phoenix在HBase中的应用

一、前言 业务使用HBase已经有一段时间了&#xff0c;期间也反馈了很多问题&#xff0c;其中反馈最多的是HBase是否支持SQL查询和二级索引&#xff0c;由于HBase在这两块上目前暂不支持&#xff0c;导致业务在使用时无法更好的利用现有的经验来查询HBase。虽然HBase本身不支持…

node.js文件操作

介绍&#xff1a;fs模块是文件操作的封装&#xff0c;它提供了文件的读取&#xff0c;写入&#xff0c;更名&#xff0c;删除&#xff0c;遍历目录&#xff0c;链接POSIX文件系统操作。与其他模块不同的是&#xff0c;fs模块中所有的操作都提供了异步和同步两个版本&#xff0c…

phoenix 使用详细介绍 创建二级索引

phoenix 关联hbase 基本使用参考&#xff1a;https://blog.csdn.net/zhangshenghang/article/details/97491597 Phoenix 创建二级索引 hbase中有表test_article ,在表空间 test_ns ,列簇 fn 下有字段 url , text , uid ,name 连接phoenixphoenix-sqlline.py hostname:2181:/hb…

node.js详解Http服务器

概念&#xff1a;Node.js提供了http模块。其中封装了一个高效的HTTP服务器和一个建议的HTTP客户端。http.server是一个基于事件的HTTP服务器。内部有C实现。接口由JavaScript封装。http.request则是一个HTTP客户端工具。用户向服务器发送请求。一、HTTP服务器 http.Server实现的…