Visual Studio环境变量使用实例:使用环境变量来组织project

前言

在前一篇文章Visual Studio中的环境变量(以Visual Studio 2013为例)中介绍了VS中的环境变量,本文将以实际样例说明怎样合理使用这些环境变量来组织VC++project。

使用vs环境变量来组织project

通常一个解决方式包括多个项目。这些项目相互之间可能存在依赖关系。以以下这个解决方式为例:

这个解决方式叫:CS.cpp, 包括了7个项目:

项目名 生成目标 描写叙述
Algorithm .exe 算法和数据结构实践
c_language .exe c语言实践
TotalSTL .exe STL实践
TrainingGround .exe C++语法自由训练场
UnderstandingCpp11 .exe 深入理解C++11代码实践
gtest .lib google c++单元測试框架,给其它几个项目作为測试框架
util .lib 个人积累工具类,为其它几个项目提供util函数

当中五个项目是生成.exe文件的应用程序,另外两个gtestutil是服务于其它五个项目的。它俩生成的是.lib库文件,来为其它五个项目链接使用。

下图是这个解决方式文件的物理路径:

能够看到,每一个项目名称相应一个同名文件夹。(Algorithm项目相应CS.cpp文件夹,由于Algorithm这个项目名字是中途改动的。

)

除了7个项目名相应的文件夹,其它几个文件夹的作用例如以下表所看到的:

文件夹 作用
include 项目中使用到的头文件存放于此
libs 项目中使用到的库文件存放于此, gtest和util这样的库project的输出文件也存放于此,如各种.lib文件
intermediate 全部项目的”中间文件夹”集中存放于此
output 全部应用程序项目的”输出文件”存放于此,如各种.exe文件
res 项目中用到的资源文件存放于此。比方.txt, .json等文件
_build 与VC++项目无关,不需留意。

以下介绍下我是怎样把这7个项目组织起来协同工作,而且做到没有冗余文件。

事实上,组织项目非常easy,仅需掌握C++程序构建的本质,关键的两个阶段:编译和链接。

第一步,让项目编译通过

这一步的目标是:让5个生成.exe的项目编译通过。以当中随意一个为例解说。其它的与之相似。那么我就以TotalSTL为例吧。

先保证TotalSTL其内部代码没有语法错误。

其次。由于代码中使用了gtest和util两个项目中的代码,因此须要确保TotalSTL项目能够搜索到gtest和util的头文件。也就是说把gtest和util的头文件所在文件夹加入到TotalSTL项目的包括路径里就可以。

添加项目包括文件夹的操作在上一篇文章中已经提到,这里不再细说。

须要注意的一点是,由于gtest和util属于公共使用的库。所以最好是把它们的头文件放在一个公共的路径下,比方放在常见的以include命名的文件夹。这正是前面表格中提到的include文件夹的作用。其物理结构例如以下图所看到的:

能够看到。在include文件夹下包括了gtest和util等子文件夹,他们是依照项目来分类,除了gtest和util这两个项目,还有其它的包括文件也集中放在此处。

我要做的是把include加入到TotalSTL包括文件夹中,运用上一篇文章学到的环境变量$(SolutionDir)。我能够这样编写这个包括文件夹:

$(SolutionDir)include/

加入完包括文件夹,在TotalSTL项目的main.cpp中,就能够这样引用gtest和util的头文件:

main.cpp

#include "gtest/gtest.h"            // gtest是include文件夹的子文件夹,gtest.h是在gtest文件夹下,因此要加上gtest/前缀
#include "util/FileReader.h"        // 同理,util是include的子文件夹,FileReader.h是在util文件夹下,因此加上util/前缀

void dummyExitFunction()
{
    elloop::FileReader::getInstance()->purege();
    char c = getchar();
}

int main(int argc, char** argv) {

#if defined(_MSC_VER) && defined(_DEBUG)
    // make program stop when debug.
    atexit(dummyExitFunction);
    turnOnMemroyCheck();
#endif

    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

当中。#include "gtest/gtest.h", gtest是include文件夹的子文件夹,gtest.h是在gtest文件夹下,因此要加上gtest/前缀

同理,#include "util/FileReader.h", util是include的子文件夹,FileReader.h是在util文件夹下,因此加上util/前缀

包括文件夹配置完毕,项目就能够顺利通过编译了。其它四个项目的配置与TotalSTL的配置一样,也把include加入到包括文件夹就可以。

第二步:让项目链接通过

在配置完包括文件夹,编译通过之后,我假设点“生成”项目,在链接阶段会报错的,是由于五个.exe项目在链接时。没有找到它们依赖的gtest和util库文件。

这一步就是配置库搜索路径:

思路是。先确定gtest和util两个项目生成的库文件存放在何处。然后把库文件所在路径加入到其它五个项目的库搜索路径就可以。

1. 确定库文件位置

跟前面讲的把公共头文件统一放在include文件夹相似,公共的库文件通常是放到名为lib或者library的文件夹下。正如前文的文件夹结构图所看到的。我把它们统一放到了$(SolutionDir)libs文件夹下。如图。gtest.lib和util.lib就是gtest和util两个项目生成的库文件:

要想做到让gtest和util这俩项目”把蛋下到libs这里”是须要设置的。以gtest项目为例,进行例如以下的设置:项目属性 - 库管理器 - 常规 - 输出文件 :

注意到当中对环境变量的使用。$(SolutionDir)libs/ 就是我的目的地,$(TargetFileName) == gtest.lib

2. 把库文件所在文件夹加入到库搜索路径

如今确定了库文件路径为:

$(SolutionDir)libs/

以下把它加入到项目的库搜索路径。还是以TotalSTL项目为例。进行例如以下操作:项目属性 - 配置属性 - 链接器 - 常规 - 附加库文件夹

经过这两个小步骤。就完毕了库文件搜索路径的设置。其它的4个项目也依照TotalSTL这样设置一下库搜索文件夹也就完毕了第二步,至此就可以保证项目链接通过了。

调整项目生成顺序

在设置完文件包括文件夹和库文件搜索文件夹之后,当我点击“生成解决方式”的时候。还是可能发生有些项目生成失败的情况。在生成失败之后。我什么也不改,再点一次“生成解决方式”,第二次就生成成功了。这是为什么呢?

这是由于项目生成顺序问题造成的。

我们知道,5个.exe项目依赖gtest和util这俩项目,假设在生成gtest和util之前,就開始生成其它项目,比方TotalSTL, 那么当TotalSTL链接时,发现gtest.lib和util.lib还没有生成,此时就生成失败了。

而第二次点击生成的时候,此时。gtest和util在第一次生成时已经成功产生gtest.lib和util.lib,第二次生成时。TotalSTL等其它失败的项目又一次重试链接,这次找到了两个.lib文件。于是生成成功了。

怎么能让解决方式一次就生成成功呢?

这就须要调整项目的生成顺序。非常easy,还是以TotalSTL为例,进行例如以下操作:项目属性 - 通用属性 - 引用 - 加入新引用

在弹出的列表中,选择其依赖的项目。选择gtest和util。确定就可以。

其它四个.exe项目也做相应处理。设置完毕就可以一次生成成功了。

管理项目的中间文件夹和输出文件夹

在上文的解决方式物理路径图中,还有两个文件夹:intermediate和output 值得介绍一下。

  • intermediate: 项目的中间文件夹,生成过程中产生的一些中间文件存放于此
  • output: 项目的输出文件夹,生成的结果文件存放于此,比方TotalSTL.exe, TotalSTL.pdb, TotalSTL.ilk这些类型的文件

设置这两个文件夹是为了方便全部项目统一管理,避免混乱。

以下是这两个文件夹的设置过程:项目属性 - 配置属性 - 常规 - 输出文件夹/中间文件夹

输出文件夹的值为: $(SolutionDir)output/$(Configuration)/$(ProjectName)

中间文件夹的值为:$(SolutionDir)intermediate/$(Configuration)/$(ProjectName)

注意当中环境变量的使用:$(SolutionDir)/intermediate$(SolutionDir)output 分别定为到上面提到的两个文件夹,然后依照编译配置, 即$(Configuration)(通常为Debug或者Release)来分文件夹。最后以项目名称来分文件夹。

生成之后的文件夹结构例如以下图所看到的, 能够看到图中路径正是把$(Configuration)(值为Debug), $(ProjectName)(项目名字)代入之后的结果:

管理可运行文件生成位置

上面在讲到gtest和util这两个项目的生成.lib的位置时。提到了改变项目的生成文件位置。

与之相似,其它5个生成.exe的项目,也能够做设置。使生成的.exe依照统一的文件夹存放。方便查找和管理。

以TotalSTL项目为例,详细操作例如以下:项目属性 - 配置属性 - 链接器 - 常规 - 输出文件

其值设置为:$(OutDir)$(TargetFileName)

注意到当中环境变量的使用,当中的$(OutDir)就是上一小节提到的输出文件夹,其值刚才被设置为$(SolutionDir)output/$(Configuration)/$(ProjectName),把它代入到上面,展开为:

$(SolutionDir)output/$(Configuration)/$(ProjectName)$(TargetFileName)

生成之后的物理路径结构为:

能够看到输出的TotalSTL.exe的路径正是”输出文件夹”。文件名称TotalSTL.exe即$(TargetFileName)

管理工作文件夹

工作文件夹是程序运行时,搜索资源文件的路径。详细设置在:项目属性 - 配置属性 - 调试 - 工作文件夹:

以TrainingGround项目为例:

其值为:$(SolutionDir)res/, 即相应开篇解决方式图中的res文件夹。

总结

本文展示了怎样借助Visual Studio的环境变量来组织一个VC++解决方式的project文件夹结构。提到了怎样使用环境变量来编写头文件包括路径、库文件搜索路径、中间文件夹、输出文件夹、输出文件位置、工作文件夹等。

解决方式代码地址:CS.cpp 1.0(visual-studio分支)



作者水平有限,对相关知识的理解和总结难免有错误,还望给予指正,非常感谢!

在这里也能看到这篇文章:github博客, CSDN博客, 欢迎訪问

时间: 2024-10-03 23:49:29

Visual Studio环境变量使用实例:使用环境变量来组织project的相关文章

在Visual Studio Code中配置GO开发环境

一.GO语言安装 详情查看:GO语言下载.安装.配置 二.GoLang插件介绍 对于Visual Studio Code开发工具,有一款优秀的GoLang插件,它的主页为:https://github.com/microsoft/vscode-go 这款插件的特性包括: 代码着彩色 代码自动完成(使用gocode) 代码片段 快速提示信息(使用godef) 跳转到定义(使用godef) 搜索参考引用(使用go-find-references) 文件大纲(使用go-outline) 重命名(使用g

Visual Studio Code中配置GO开发环境

在Visual Studio Code中配置GO开发环境 一.GO语言安装 详情查看:GO语言下载.安装.配置 二.GoLang插件介绍 对于Visual Studio Code开发工具,有一款优秀的GoLang插件,它的主页为:https://github.com/microsoft/vscode-go 这款插件的特性包括: Colorization 代码着彩色 Completion Lists 代码自动完成(使用gocode) Snippets  代码片段 Quick Info 快速提示信息

Visual Studio Code (vscode) 配置 C / C++ 环境

Visual Studio Code (vscode) 配置 C / C++ 环境 昨天突发奇想,想使用vscode配置C++环境,因为不想下载 Dev OR codeblock,然后借助了很多网上教程,用了昨天整整一下午的时间最后终于成功了(哈哈哈哈哈……).今天跟大家分享一下~~~ 因为还只是个编程小白,参考资料有点多 ↓ ↓ ↓ 官方文档                 —— 参考配置过程 CSDN原创文章       —— 参考主要配置过程 知乎达人                  —

Cocos发展Visual Studio下一个libcurl图书馆开发环境的搭建

我们解释win32在Visual Studio下一个libcurl图书馆开发环境的搭建.Cocos2d-x发动机实际上与Win32在访问libcurl库.Cocos2d-x 3.x在libcurl库文件的位置<project文件夹>\cocos2d\external\curl\prebuilt\win32文件夹中,头文件在<project文件夹>\cocos2d\external\curl\include\win32文件夹中.首先,我们须要配置头文件搜索路径,选中HelloCppp

Cocos2d-x 2.2.3 + Visual studio 2013 + python2.7.5开发环境搭建

Cocos2d-x 环境搭建 2014年4月14日 Cocos2d-x开发环境搭建 Cocos2d-x 3.0 已经出来咯,本篇博客还是在Cocos2d-x 2.2.3下的,其他版本环境的配置的异同童鞋们自己查询其他资料吧. 想搭建好Cocos2d-x的开发环境,需要准备以下工具和材料: 1.Cocos2d-x 2.2.3引擎 2.Visual studio 2013 微软提供的IDE 3.python2.7.5  具体的下载地址和下载方式我这里就不说,自己百度,我相信童鞋们有这个能力. 环境搭

Visual Studio Code 搭建 C/C++开发环境方法总结

之前看错资料踩了不少坑,先将可行经验总结如下: 1. 下载 Visual Studio Code 并安装.地址:https://code.visualstudio.com 2. 安装 C/C++插件与 Code Runner 插件. 3. 下载 GCC 编译器,地址:https://sourceforge.net/projects/mingw-w64/files/mingw-w64/ 4. 压缩包内全部内容解压到 C:\ 完成后可见 mingw64 文件夹. 5. [关键步骤]设置 Path 环

Visual Studio Code中C/C++的环境配置

Visual Studio Code 的功能十分强大,但是对我这种小白不是很友好,它和其它的集成开发工具不同,Visual Studio Code (以下简称VS)自身其实仅仅是一个编辑器, 是不具备编译代码和运行代码的功能的,它只有与其他语言的编译器和自身各种各样强大的扩展结合起来才称的上是开发工具,所以我们自己需要自己手动的来配置它的编译环境, 以下就是我对配置VS下C/C++开发环境所做的一个小教程. 1,下载MinGW编译器 地址:https://sourceforge.net/proj

使用visual studio 2013 快速搭建phonegap开发环境

前一段时间开发了一款简单的Phonegap应用,遇到了很多坑,其中有一个坑就是在搭建开发环境上.由于Phonegap 2.x 与3.x 区别比较大,导致了开发环境也有所不同.2.x 是这样的http://www.cnblogs.com/Random/archive/2011/12/28/2305398.html这一系列的文章有些没讲清楚版本号,也是入坑的一个原因吧. 3.x 需要通过nodejs安装 生成相应平台的工程文件,然后再开发. 另外,在这再解释一下cordova和phonegap的关系

visual studio开发nodejs教程1搭建环境

1 安装nodejsv6.10.3 下载地址  https://nodejs.org/dist/v6.10.3/node-v6.10.3-x64.msi 2 安装 NTVS(Node.js Tools for Visual Studio)  1.2for vs2015 vs-工具-扩展和更新,新窗口 左侧选择 联机-vs库 搜索ntvs,下载安装 3 打开vs2015  文件-新建-项目,按图创建 创建好的项目目录结构如图 4 点击调试按钮打开浏览器,即可看到运行的项目 http://local

Visual Studio 2013 Xamarin for Android开发环境搭建与配置&amp;Genymotion

Xamarin是基于Mono的平台. Xamarin旨在让开发者可以用C#编写iOS, Android, Mac应用程序,也就是跨平台移动开发. 1,进入Xamarin官方网站http://xamarin.com/下载xamarin,需要填写一些信息才能下载 完成的同时会弹出所需要的资源窗口 2,根据↑给出的资源Uri,分别下载Java JDK.Android SDK.Android NDK.GTK.Xamarin for Visual Studio(如果你用Visual Studio开发就不用