如果只是简单创建一个VS C++Project或者MFC Project,可能很多时候,只关心将Project放在硬盘的那个位置,与Project目录相关的的其他问题,并不引人注意,我们也不是十分在意。有时我们不得不进行工作目录方面的设置,如Project中需要用到OpenCV图像处理库;生成的可执行文件需要在本地磁盘中创建文件,或者需要打开本地·磁盘中的文件等。下面来探讨VS C++ Project工作目录方面的话题。
VS C++ Project的工作目录是Project属性的一部分,查看、修改、设置等都在目录项中进行。下面以用VS 2022 创建的DequeTest Project (对话框程序)为例,演示目录属性的查看与设置。
点击“项目”菜单,然后点击“DequeTest和属性"子菜单:
弹出DequeTest属性页,如下:
在上面的属性页的配置属性项下的常规项中可以看到:输出目录、中间目录两项与目录相关的内容。点击输出目录项后面的向下符号,即可想象展开,看到”编辑“与”浏览“两个选项:
点击”编辑“项,即可看到输出目录,如下:
输出目录中$(SolutionDir)$(Platform)\$(Configuration)\表示编译生成的文件(输出文件)放在Project所在目录下的平台名目录下的配置目录下,本程序是在win10下用VS2022创建,因此平台名是X64,目前Project配置如下:
配置目录名是:Debug
生成的文件路径如下:
修改输出目录如下:
重新生成解决方案:
可以看到在D目录下生成了输出文件:
点击”浏览“选项,则是浏览选择输出目录,缺省是Project所在目录,如下:
同样中间目录也可修改,也有”编辑“与浏览两个选项,如下:
在配置属性的高级选项中有一项有提到输出目录,如下:
”将C++运行时复制到输出目录“,是什么意思?先不管它,其缺省值是否,将其改为是,如下:
重新生成,看下结果如何。可以看到D目录下多了很多dll文件,如下:
实际上是将VC++ runtime的1相关文件复制到了输出目录中。一般情况下,不需要将此项选为:”是“,如果的确需要VC运行库,可以在程序文件打包时打包VC运行库,在程序安装时,让其安装VC运行库。
点击配置属性相下的”调试“项,可以看到工作目录一栏,如下:
将其展开,同样也有”编辑“与”浏览“两个选项,可用这两个选项对其进行修改。
点击编辑,在弹出的工作目录对话框中可以看到当前工作目录:
也可在这个对话框中对工作目录进行修改。这里不对其修改。
展开”VC++目录“项,可以看到很多与目录有关得到项目:
这些目录项,都是可以编辑或者配置的。其编辑或配置需依实际需求进行。一般情况下不要随意修改,否则可能否导致出错。例如本示例项目需要用到OpenCV,就需要配置”包含目录“与库目录。包含目录配置是指出包含内容所在目录,DequeTest Project的配置如下:
DequeTest Project的库目录配置是指出OpenCv库所在目录,其配置如下:
上面探讨了与Project工作目录及相关目录的配置。如果程序要打开工作目录中的文件,需要如何配置路径呢?例如,如果要为本示例的对话框中的打开,按钮添加代码要打开工作目录中的图像文件要如何设置文件路径呢?
现在来为”打开“按钮来添加事件处理程序,在添加代码前先将一个图像文件Copy到Project目录下,因为该目录即为Project的工作目录。如下:
添加”打开”按钮事件处理程序的代码如下:
void CDequeTestDlg::OnBnClickedOpen()
{
Mat src = imread("1.tif");
if (src.empty())
MessageBox(L"无法打开图像!");
else
{
MatToCImage(src, mImage);
DispalyImage(mImage);
}
}
由于图像文件已经放在其工作目录中,所以不需要要特别指出文件所在目录。上面代码中用到了两个函数:MatToCImage与DisplayImage,这里两个函数事先已写好,因与本文主题无关,这里不特别做说明。试运行,结果如下:
点击“打开”按钮,结果如下:
已正常打开图像。因.\\也是表示当前目录(相对路径表示法),上面的代码修改如下, 也应该可以正常打开图像。
void CDequeTestDlg::OnBnClickedOpen()
{
//Mat src = imread("1.tif");
Mat src = imread(".\\1.tif");
if (src.empty())
MessageBox(L"无法打开图像!");
else
{
MatToCImage(src, mImage);
DispalyImage(mImage);
}
}
试运行,再点击打开,结果如下:
确实能够正常打开。
如果程序编译成了可执行的exe文件,exe程序文件的工作目录又是哪个目录?当然是可执行的exe文件所在目录。将可执行的exe文件与图像文件放在同一目,如下:
以管理员身份运行程序,点击打开,结果如下:
可以正常打开。如果将“打开”的源代码改为如下:
void CDequeTestDlg::OnBnClickedOpen()
{
//Mat src = imread("1.tif");
//Mat src = imread(".\\1.tif");
Mat src = imread("..\\1.tif");
if (src.empty())
MessageBox(L"无法打开图像!");
else
{
MatToCImage(src, mImage);
DispalyImage(mImage);
}
}
则图像文件则需要放在生成的可执行exe文件的上级文件夹中,否则无法打开。将上面Release文件夹中的可执行文件用新生成的文件替代。试运行,点击打开,结果如下:
将图片移动到上级文件夹中。如下:
试运行,点击打开,结果如下:
有关VS C++的工作目录设置就探讨到这里,需要说明的是:如果没有修改Project的工作目录,Project的工作目录就是Project的的所在目录,生成的可执行的exe文件的工作目录是其所在目录,即将生成的可执行的exe文件Copy到哪个目录下,这个目录就变成了生成的可执行的exe程序文件的工作目录,如果该程序文件选打开文件,文件的相对位置必须正确。