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

ConfigurationName配置名字,通常是Debug或者ReleaseIntDir编译器使用的中间目录,产出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所在目录。工作目录表示进行某项操作的目的目录,会随着OpenFileDialog、SaveFileDialog等对象所确定的目录而改变。“工作目录”属性作用是程序运行后唯一识别的默认目录,即工作后只认识这个目录,工作目录这个名字描述的就很形象,(可以将所依赖的lib和dll库文件所在目录设为工作目录,但一般是把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"中并不是由程序解释的字符串,所以不用转义。

先贴上参考文献: 1. http://www.sxzhongrui.com/blog/2014-02-opencv_configuration_in_vs.html 2. http://www.sxzhongrui.com/morewindows/article/details/8225783/ 3. http://www.sxzhongrui.com/link?url=-5zunOvY_oPN4O5UpYHQm1GGpI7Y-CJBN-2C2VnZYAgQsmNBzTXU7JycgSACaV3Z8Ru5OaVdeucfxdW0WcbJlK 4. http://www.sxzhongrui.com/topics/380057699 正文 Opencv下载 1. 下载 Opencv for Windows 最新版本,本文是 Opencv 2.4.11。双击后会出现解压提示,实际上就是“安装”了,路径填写为 D:/Program Files,然后确定。 D:/Program Files 可以为任意自己希望opencv安装的路径,解压完成后,会在你所填目录中新增一个 opencv文件夹,里面就是opencv的所有内容了。例如按照我的路径,解压完成后Opencv就在 D:/Program Files/opencv 里面了。 环境变量设置 在系统变量里面新建变量,名为 opencv,值为自己解压opencv路径下的build路径,如 D:\Program Files\opencv\build。 Tip :这一步是方便以后如果opencv路径改变了,只需要修改此变量就可以了,而不必做大范围修改。 在系统变量里面编辑 Path 变量,在末尾添加” %opencv%\x86\vc10\bin;%opencv%\x64\vc10\bin”或者 “D:\Program Files\opencv\build\x64\vc10\bin;D:\Program Files\opencv\build\x86\vc10\bin”. vc10, vc11, vc12 分别表示VS2010, VS2012, VS2013的Visual Studio使用的编译器版本,根据自己的VS版本来填写正确的编译器版本号。(有时候填写完环境变量后重启系统是个不错的方法)。 编写Opencv的VS工程容属性表 在D:\Program Files\opencv下新建文件opencv2411.props,编辑内容为

$(OPENCV)\include;$(IncludePath)

$(OPENCV)\x86\vc10\lib;$(LibraryPath)

$(OPENCV)\x64\vc10\lib;$(LibraryPath)

opencv_calib3d2411d.lib;opencv_contrib2411d.lib;opencv_core2411d.lib;

opencv_features2d2411d.lib;opencv_flann2411d.lib;opencv_gpu2411d.lib;opencv_highgui2411d.lib;

opencv_imgproc2411d.lib;opencv_legacy2411d.lib;opencv_ml2411d.lib;opencv_nonfree2411d.lib;

opencv_objdetect2411d.lib;opencv_ocl2411d.lib;opencv_photo2411d.lib;opencv_stitching2411d.lib;

opencv_superres2411d.lib;opencv_ts2411d.lib;opencv_video2411d.lib;opencv_videostab2411d.lib;

%(AdditionalDependencies)

opencv_calib3d2411.lib;opencv_contrib2411.lib;opencv_core2411.lib;opencv_features2d2411.lib;

opencv_flann2411.lib;opencv_gpu2411.lib;opencv_highgui2411.lib;opencv_imgproc2411.lib;opencv_legacy2411.lib;

opencv_ml2411.lib;opencv_nonfree2411.lib;opencv_objdetect2411.lib;opencv_ocl2411.lib;opencv_photo2411.lib;

opencv_stitching2411.lib;opencv_superres2411.lib;opencv_ts2411.lib;opencv_video2411.lib;opencv_videostab2411.lib;

%(AdditionalDependencies)

这份属性表为opencv2.4.11的VS工程属性表,兼容64位和32位平台,兼容Debug和Release配置。

很容易看出如何修改:

如果你没有配置%opencv%环境变量,则只需要修改 IncludePath 和 LibraryPath 所指三个标签,用绝对路径代替 $(opencv); 如果你的Visual Studio版本与我的不同,则需要修改 LibraryPath 所指两个标签的将编译器版本号,VS2010对应vc10,VS2012对应vc11,VS2013对应vc12; 如果你的opencv与我的版本不同,只需要将两个 AdditionalDependencies 标签内的所有lib的版本号修正即可(所有的2411改为自己的版本号),并在opencv的lib目录下检查一下lib名称是否对应。 在VS中新建工程并导入我们新建的属性表opencv2411.props 具体操作请参考 Opencv 完美配置攻略 2014 (Win8.1 + Opencv 2.4.8 + VS 2013) | Yuanbo She http://www.sxzhongrui.com/blog/2014-02-opencv_configuration_in_vs.html 补充 编译程序时如若遇到以下问题,请参阅本文开始的参考文献中的相关链接 1. 应用程序无法正常启动0xc000007b 2. fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

下载MPI

之前安装了MPICH2,调试好环境之后,写了一个小的并行程序,发现在vs2010里编译能通过,解决方案也能生成成功。但是在Dos里面运行的时候,没有反应,试过网上各种各样的方法,都不行。后来才知道,可能是兼容的问题。Windows为了兼容MPI,自己做了msmpi版本,我安装Macrosoft MPI v8.1之后,并行程序成功运行,如图 最好不要下载v10,不然某些新功能与旧版本的vs可能会不兼容,编译通不过,这里选用了v8.1版本 https://www.sxzhongrui.com/en-us/download/confirmation.aspx?id=55494 两者都勾选下载,然后分别点击安装即可。可以修改安装路径,我安装在了D盘。

vs2010配置项目环境

新建项目

打开vs2010新建项目–>Visual C++ -->Win32控制台应用–>改名称–>位置(一定要记得)–>点击确定选择空项目–>完成右击源文件–>添加新建项–>C++文件

配置项目属性

VC++目录

包含目录加入MPI的include文件,我装在D盘的路径是D:\Program Files (x86)\Microsoft SDKs\MPI\Include 库目录加入MPI的lib\x86文件,我的D:\Program Files (x86)\Microsoft SDKs\MPI\Lib\x86 我的电脑是64位的,之前选择x64会报错,后来查了一下,64位的电脑可以运行32位的程序,我改选x86之后就能成功生成解决方案了,具体什么原因我也不知道,可能还是版本的兼容问题吧。加进去的时候一定要用英文输入法的分号。

C/C++

C/C+±->预处理器–>预处理器定义–>加入MPICH_SKIP_MPICXX

链接器

链接器–>输入–>附加依赖项 加入msmpi.lib 全部配置完之后,点击应用,再点击确定,配置就完成啦!

测试

#include "mpi.h"

#include

int main(int argc, char* argv[])

{

int rank, numproces;

int namelen;

char processor_name[MPI_MAX_PROCESSOR_NAME];

MPI_Init(&argc, &argv);

MPI_Comm_rank(MPI_COMM_WORLD, &rank);//获得进程号

MPI_Comm_size(MPI_COMM_WORLD, &numproces);//返回通信子的进程数

MPI_Get_processor_name(processor_name, &namelen);

fprintf(stderr, "hello world! process %d of %d on %s\n", rank, numproces, processor_name);

MPI_Finalize();

return 0;

}

点击生成–>编译

编译成功

点击生成–>生成解决方案

生成解决方案成功

然后找到项目所在的文件夹,进入Debug,会出现以下三个文件

运行程序

在键盘上同时按Win+R,再输入cmd,回车,进入Dos命令窗口。 然后进入生成的Debug文件夹(cd 路径为Debug文件的地址,可以直接复制过去,然后回车) 然后输入命令

mpiexec -n 3 program1.exe

回车,运行成功