Dos下运行VC++ console程序的环境设置

在windows下用makefile编译exe(一) 前情提要 自动化测试的项目开发,基于windows所提供的api接口,编写,生成exe可执行文件,配合python测试脚本,进行自动化的代码功能测试。在py自动化测试的过程中,根据不同的测试用例,需要不断去修改源测试代码的测试宏接口,然后编译为可执行文件。这个过程中,需要用到自动化编译makefile。 软件&环境 主机系统:windows7 虚拟linux环境:cygwin64 开发ide:code::blocks make编译使用的GNU:MinGW:gcc,g++ 开发语言 测试程序的开发语言 阅读详情

==========================================
注:摘录侯俊杰--在 console mode 中使用 C/C++ 编译器

●C/C++ 编译器需要的环境变数设定

古早以来,PC 上的 C 编译器,就需要两个环境变数:

LIB:这个环境变数告诉编译器说,必要的 libraries 在哪里(哪个磁碟目录下)
INCLUDE:告诉编译器说,必要的 header files 在哪里(哪个磁碟目录下)

另外,为了让我们能够在任何 working directory 都叫得到编译器,当然我们必须设定 PATH。

从古早以来,一直到现在,C/C++ 编译器都需要这三个环境变数。


●以 Visual C++ 为例

以 Visual C++ 为例,如果安装後的档案布局如下:

C:/MSDEV/VC98/BIN : 这里放有编译器 CL.EXE
C:/MSDEV/VC98/INCLUDE : 这里放有 C/C++ header files
C:/MSDEV/VC98/LIB : 这里放有 C/C++ standard libraries

那麽你可以写一个批次档如下:

set PATH=C:/MSDEV/VC98/BIN;C:/MSDEV/COMMON/MSDEV98/BIN
set INCLUDE=C:/MSDEV/VC98/INCLUDE
set LIB=C:/MSDEV/VC98/LIB

之所以需要另外设定 PATH=C:/MSDEV/COMMON/MSDEV98/BIN,是因为编译器 CL.EXE 执行时需要 MSPDB60.DLL,而它被安装於 C:/MSDEV/COMMON/MSDEV98/BIN 之中。

如果你写的程式不只是单纯的 C/C++ 程式,还用到了 MFC,一样可以在 console mode 下编译,这时候你的环境变数应该如此设定:

set PATH=C:/MSDEV/VC98/BIN;C:/MSDEV/COMMON/MSDEV98/BIN
set INCLUDE=C:/MSDEV/VC98/INCLUDE;C:/MSDEV/VC98/MFC/INCLUDE
set LIB=C:/MSDEV/VC98/LIB;C:/MSDEV/VC98/MFC/LIB

多指定了 MFC/INCLUDE 和 MFC/LIB,就可以让编译器和联结器找到 MFC 的 header files 和 libraries。如果你还需要用到 ATL,就得在 INCLUDE 环境变数中再加上 C:/MSDEV/VC98/ATL/INCLUDE。

=========================================

我的VC++安装在D:/Program Files/Microsoft Visual Studio下,所以改写批次档如下:

set PATH=D:/Program Files/Microsoft Visual Studio/VC98/Bin;D:/Program Files/Microsoft Visual Studio/Common/MSDev98/Bin
set INCLUDE=D:/Program Files/Microsoft Visual Studio/VC98/Include;D:/Program Files/Microsoft Visual Studio/VC98/MFC/Include
set LIB=D:/Program Files/Microsoft Visual Studio/VC98/Lib;D:/Program Files/Microsoft Visual Studio/VC98/MFC/Lib

然后运行cmd,将以上设置复制粘贴到鼠标闪烁处。如果想要确认路径更改正确,可以键入set命令查看。

注:这样的环境变量修改,仅对本次命令行窗口有效,因为它是一个虚拟设备。如果想要每次进入时,不做这个工作。可以运行VCVARS32.BAT然后设置你的环境变量。为了不影响VC++的原本设置方便集成环境的使用,我并没有实际操作,一个简单的复制粘贴也不见得麻烦。另外还可以在我的电脑-属性-高级-环境变量里直接修改,这个修改也是永久性的。到这里,路径就设置好了。下面试操作一下:

我在F:/盘保存了一个test.cpp文件作为测试文件。文件内容如下:

=======================================
#include <iostream.h>
void main()
{
 cout<<"hello"<<endl;
}
=========================================

使用cd命令把当前命令行窗口路径切换到F:/>,然后执行cl test.cpp命令,在F:/盘路径下生成了两个文件,test.obj和test.exe。然后再运行test.exe,就可以看到结果了(输出hello)。

下面再举一个例子,也就是下面要学习的makefile文件。测试文件名为mypath.mak(你可以任意取名),依旧存储在当前路径下。

===========================
all:  
  @echo   $(PATH)
==========================

运行命令nmake mypath.mak,你可以看到输出结果为你刚才设置过的路径(我的结果是D:/Program Files/Microsoft Visual Studio/VC98/Bin;D:/Program Files/Microsoft Visual Studio/Common/MSDev98/Bin)。

2.产生自己的makefile文件

下面是我在网上找到的一个简单的例子及其解说(http://www.readygo.com.cn/it-1104697.html)

==================================
下面来看一个简单的例子(以下内容均以Win32平台为例):  
  文件名:makefile  
  1.   #   makefile  
  2.   #   this   is   a   example   of   make   file  
  3.   all:a1   a2  
  4.       @echo   this   is   all!  
  5.   a1:  
  6.       @echo   this   is   a1!  
  7.   a2:  
  8.       @echo   this   is   a2!  
   
  运行make后,结果如下:  
  this   is   a1!  
  this   is   a2!  
  this   is   all!  
   
 现在让我们来分析一下这个简单的规则文件。
  
       第1、2行不用说,一眼就可以看出是注释。在Make规则文件中,注释是以“#”开始,是行注释,和C++中的“//”功能一样。不过你可不能把它放到其它的语句之后,否则就错了。第3行就是规则开始了!all:a1   a2一行中,规则的名字就是all,它通常是目标名(target)。一条规则可以有不止一个名字,像这一行,你也可以把它写成all   all2:a1   a2。这时,规则就有了两个名称—all和all2。当然,还可以有更多,都看你自己。后面的5、7两行也分别是两条规则的起始。在“:”之后的,就是依赖项。在这一行里,依赖项有两个,分别是a1和a2。这些依赖项可以是其它的规则名(目标名),也可以是文件名。依赖和目标之间的关系就是“依赖关系”。一条规则中,可以有零个(像后面的两条规则)、一个或多个依赖。第4行@echo   this   is   all!是命令行。它是执行all规则时要执行的命令。要注意的是,一条规则内的命令要以tab为一行的起始,以表示命令是属于一个规则。一条规则也可以有多条命令,每条命令占一行(要以tab开头)。至于可以使用哪些命令,这完全取决于你使用的OS和SHELL。
 
        当执行make时,它会找到第一条规则。然后,make就会检查依赖和目标之间的关系。如果目标比依赖旧,就执行规则,以更新目标。执行完规则就结束。如何判定目标和依赖的新旧呢?如果目标(文件)不存在,目标的时间就为0;如果目标(文件存在),目标的时间就为文件的修改时间。如果依赖项是一条规则,就执行依赖的规则(这里是一个递归),然后依赖的时间就是当前最新时间;如果是一个存在的文件,就为文件的修改时间,否则就报错。之后,就可以比较目标和依赖之间的关系。不过,有一点特殊的是,在没有依赖项时,依赖的时间为1。
 
        在这个例子中,make先找到规则“all”,发现目标不存在,所以目标的时间为0;然后在查找依赖“a1”,结果“a1”不存在;于是,执行规则“a1”。“a1”不存在,所以它的时间为0,而“a1”没有依赖,它的依赖时间为1;1>0,所以,执行规则“a1”。然后返回规则“all”,再检查依赖“a2”。“a2”执行过程同“a1”。这时,“all”的目标时间为0,依赖时间为最新时间。于是,执行规则“all”的命令。
 
       当然,大家也可以指定一条规则让make执行,比如:make   a1这个命令就是告诉make程序不去找第一条规则,而是规则“a1”来执行。并且我们还可以一次执行多条规则,比如:执行make   a1   a2就会连续执行“a1”、“a2”两条规则。  

      OK,虽然讲得很混乱,但也费了我半天的力气。大家应该有一点了解make规则的执行过程了吧。  
==============================================

依赖的基本写法如下:
Target:Dependence
            Command

==============================================
Target可以是文件名。Dependence可以是其它的target名或文件名。Command就是操作系统所运行的命令行。  
  变量  
      一个make规则文件有这些内容就已经基本可以工作了。可是,当我们在编译一个程序时,如果有些内容要反复用到,每次都要写一长串的话,是很麻烦的。于是,make就引入了宏这个概念(其实也可以看成简单的脚本语言)。  
  宏变量的定义如下:  
  var1   =   this   is   a   macro   demo!  
  var1就是变量名,它的值就是“this   is   a   macro   demo!”  
  如果我们要使用这个变量的值,那只有通过$这个运算符才行—$(var1)代表的就是“this   is   a   macro   demo!”。  
  如下makefile  
  1.   var1   =   this   is   a   macro   demo!  
  2.   all:  
  3.       @echo   $(var1)  
  结果输出:  
  this   is   a   macro   demo!  
  用户在执行命令行时也可以定义宏变量。其形式如下:  
  make   all   var1=”this   is   a   test”  
  执行结果为:  
  this   is   a   test  
  我们不仅可以使用自定义变量,还可以通过这种方式使用系统环境变量。这样可以大大方便我们建议灵活的规则。如下makefile  
  1.   all:  
  2.       @echo   $(WINDIR)  
  执行结果为:  
  C:/WINDOWS
  (注意:makefile中的变量是大小写敏感的)  
==========================================

下面介绍makefile文件的一些内置变量:

==========================================
  $@代表规则中的目标名(也就是规则名)。  
  $<代表规则中的依赖项目。注意,它只代表规则所有依赖项目中的第一项!  
  其它还有:  
  $^代表规则中所有的依赖项目。  
  $?代表规则中时间新于目标的依赖项目。  
  不仅如此,还可以给这些特殊的变量加一些限制。  
  如:  
  在规则  
  debug/out.exe   :   out.obj  
  中,$@代表debug/out.exe,而$(@D)代表目录名debug,$(@F)代表文件名out.exe。其它如$(<D)、$(<F)、$(^D)、$(^F)、$(?D)、$(?F)与此类似。  
=============================================

举个例子说明,下面是原始makefile文件内容:

==============================================
myprog : foo.o bar.o
     gcc foo.o bar.o -o myprog
    
    foo.o : foo.c foo.h bar.h
     gcc -c foo.c -o foo.o
    
    bar.o : bar.c bar.h
     gcc -c bar.c -o bar.o
==============================================

用变量代替后的文件内容:

==============================================
OBJS = foo.o bar.o
    CC = gcc
    CFLAGS = -Wall -O -g
    
    myprog : $(OBJS)
     $(CC) $^ -o $@
    
    foo.o : foo.c foo.h bar.h
     $(CC) $(CFLAGS) -c $<-o $@
    
    bar.o : bar.c bar.h
     $(CC) $(CFLAGS) -c $<-o $@
==============================================

记录Windows下编译Makefile文件 因需要在windows环境下链接Lua库,其中需要使用Makefile文件,在下载Lua源代码后,需要安装gcc环境。 阅读详情

相关推荐

VC++隐藏DOS窗口:从原理到实践的4种核心方法

在Windows程序开发中,理解控制台程序与图形界面程序的差异是基础。控制台程序默认链接到控制台子系统,系统会为其分配DOS窗口;而Windows桌面程序链接到Windows子系统,从根本上避免了控制台窗口的产生。这一机制的核心在于程序的入口函数和链接器子系统设置。掌握进程创建与控制技术,特别是CreateProcess API配合STARTUPINFO结构,能够实现对子进程窗口状态的精细控制,这对于开发后台服务、系统工具等需要静默运行的程序至关重要。在实际应用中,无论是运行批处理文件还是调用命令行工具,通

weixin_30443747的博客 328

windows使用makefile的三种方法

windows使用makefile

VimianC的博客 3万+

OpenCV学习笔记(2)隐藏 Console 窗口

在VC++中使用OpenCV,一般是建立一个 win32 console application 项目,当运行此类程序的时候,默认情况下会有一个类似DOS窗口的console窗口,供程序与用户之间交互之用。 但是有时候我们只想在程序中运行一段功能代码,不希望显示这个 console 窗口,而是让代码执行完毕之后程序自动退出。隐藏这种 win32 console application 的 c

晨宇思远 1万+

在windows系统下安装make编译功能

在windows系统下安装make编译功能

m0_61812914的博客 1万+

VC++编译命令行参数简介及示例代码

编程语言的编译过程是将源代码转换为可执行文件的过程。在使用VC++编译器进行编译时,我们可以通过命令行参数来控制编译过程中的各种选项和参数。本文将介绍一些常用的VC++编译命令行参数,并提供相应的示例代码。以上是一些常用的VC++编译命令行参数及其示例代码。通过灵活使用这些参数,我们可以对编译过程进行定制化配置,以满足不同的需求。使用命令行编译可以方便地进行批量编译和自动化构建,提高开发效率。

CodeNexus的博客 377

RK3588 EVB开发板原理图讲解【六】

该原理图展示了eMMC Flash与主控芯片之间的连接关系,以及相关的电源、信号线路和去耦电容等。

weixin_48721556的博客 1171

VS中后台运行设置

背景知识 操作系统装载应用程序后,做完初始化工作就转到程序的入口点执行。 程序默认入口点实际上是由连接程序设置的,不同的连接器选择的入口函数也不尽相同。 在VC++下,连接器对控制台程序设置的入口函数是 mainCRTStartup,mainCRTStartup 再调用你自己编写的 main 函数; 对图形用户界面(GUI)程序设置的入口函数是 WinMainCRTStartup,WinMainCRTStartup 调用你自己写的 WinMain 函数。 具体设置哪个入口点是由连接器的“/s

weixin_45004203的博客 3013

自动驾驶仿真:基于Carsim开发的加速度请求模型

1、自动驾驶行业中,算法端对于纵向控制的功能预留接口基本都是加速度,我们需要给控制器仿真加速度的信号,控制器才会实现对纵向功能的控制。2、Carsim或者其他动力学软件,主要提供者节气门开度和主缸压力进行控制。我们在进行联合仿真时,往往都要通过PID的方式将请求加速度转换成对应的节气门开度与主缸压力传给动力学软件进行闭环控制。

zataji的博客 6914

关于Console程序和win32程序的程序入口

操作系统装载应用程序后,做完初始化工作就转到程序的入口点执行。程序的默认入口点由连接程序设置, 不同的连接器选择的入口函数也不尽相同。在VC++下,连接器对控制台程序设置的入口函数是 mainCRTStartup,mainCRTStartup 再调用main 函数;对图形用户界面(GUI)程序设置的入口函数是 WinMainCRTStartup,WinMainCRTStartup 调用你自己写的

aitcax的专栏 1836

Jetson编译安装pycuda

可使用nvcc --version查看是否有信息输出,若没有,且安装cuda的情况下,需要手动将CUDA 的路径添加到环境变量中。编译生成_pvt_struct.cpython-38-aarch64-linux-gnu.so文件。基于jetson orin nano jetpack512模块上安装pycuda。4、获取pycuda源码(版本根据实际情况获取)2、进入conda环境并安装cuda工具包。9、若未检测出来需要清除并强制编译。7、编译成功后安装pycuda。5、配置编译并设置环境变量。

qq_48175141的博客 972

Unity之Timeline教程

Unity Timeline是Unity的一种时间轴编辑器工具,用于制作和管理游戏中的动画、剧情以及事件触发。它提供了直观的界面,使得开发者可以通过拖放操作轻松创建和编辑时间轴。Activation Track:用于控制物体的激活状态。可以在轨道上添加关键帧,控制物体的激活和非激活状态。Animation Track:用于处理物体的动画。可以在此轨道上添加关键帧,编辑物体的动画状态。Audio Track:用于处理场景中的音频。可以管理音频的播放、暂停、淡入淡出等操作。

TxNet 9442

/subsystem:windows 与 /subsystem:console

  操作系统装载应用程序后,做完初始化工作就转到程序的入口点执行。程序的默认入口点实际上是由连接程序设置的,不同的连接器选择的入口函数也不尽相同。在VC++下,连接器对控制台程序设置的入口函数是 mainCRTStartup,mainCRTStartup 再调用你自己编写的 main 函数;对图形用户界面(GUI)程序设置的入口函数是 WinMainCRTStartup,WinMainCRTSta

随笔 1万+

为Ollama本地大模型添加持久化记忆层:openclaw-ollama-memory项目详解

在构建基于大型语言模型(LLM)的对话应用时,上下文管理是核心技术挑战之一。其原理在于模型本身不具备跨会话的持久化记忆能力,每次请求都是独立的。这导致在多轮对话中,模型无法有效利用历史信息,用户体验割裂。从技术价值看,独立的记忆层通过解耦推理与存储,能突破模型固定上下文窗口的限制,实现更智能、连贯的交互。其核心应用场景包括聊天机器人、智能助手及需要长期记忆的复杂代理。本文聚焦的 openclaw-ollama-memory 项目,正是为 Ollama 生态提供的记忆层解决方案,它通过向量检索和智能摘要等机制

weixin_42521558的博客 312

VC++小技巧之隐藏Console窗口

当创建一个控制台程序时,又不想看到其窗口可用如下代码解决:#ifdef NDEBUG#pragma comment( linker, "/subsystem:/"windows/" /entry:/"mainCRTStartup/"" )#endif首先来看一下linker的 /subsystem 选项    该选项的语法形式如下:  /SUBSYSTEM:{CONSOLE|EFI_APPLICA

Deniz的专栏 1998

国产麒麟V10系统命令大全,100个实用命令助你玩转系统!

国产麒麟V10系统命令大全,100个实用命令助你玩转系统!

网络技术联盟站 1909

Q3D提取PCB走线RLCG参数

介绍一种提取PCB走线寄生电容和寄生电感的方法

sinat_15150363的博客 2918

VC++中新建Win32 Application和Win32 Console Application有什么区别?

Win32 application 是基于WINDOWS平台的32位开发环境开发应用程序,SDK程序。 Win32 Console application 是基于DOS开发平台开发应用程序,不能使用与图形有关的函数,控制台程序。  EXE文件本身有区别:在文件头里(PE头)有一个标记表明该文件是Application还是Console OS在创建对应的进程时,如果是Conso

ME的专栏 4261

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

VC++中的Win32 Application和Win32 Console Application区别

Win32 Application和Win32 Console Application 都是工作在32位Windows环境的程序。  其中Win32 Application 就是普通的常见的窗口应用程序,当然有的界面做得比较个性化,比如 圆形的、不规则形状的…… 它们都是所谓的GUI(Graphics User Interface图形用户接口),我们 可以通过鼠标点击来完成控制。 Win32

MR-Tech 682

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

VC++6.0 下设置连接器 实现Win32窗口和命令行的切换

1  首先看下linker的 /subsystem 选项 该选项的语法形式如下: /SUBSYSTEM:{CONSOLE|EFI_APPLICATION|EFI_BOOT_SERVICE_DRIVER|             EFI_ROM|EFI_RUNTIME_DRIVER|NATIVE|POSIX|Windows|WindowsCE}

。。。专栏 4401

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

OpenCV学习 隐藏 Console 窗口

在VC++中使用OpenCV,一般是建立一个 win32 console application 项目,当运行此类程序的时候,默认情况下会有一个类似DOS窗口的console窗口,供程序与用户之间交互之用。 但是有时候我们只想在程序中运行一段功能代码,不希望显示这个 console 窗口,而是让代码执行完毕之后程序自动退出。隐藏这种 win32 console application 的...

weixin_30501857的博客 192
上一篇: VC中cl.exe命令使用方法
下一篇: 命令行对编译环境设置及系统环境变量一览
memory_xj
博客等级 码龄24年 44粉丝 23原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值