用nmake来编译,问环境变量怎么设置
2014-09-11 21:15
330 查看
取消关注 关注 cxdzxc cxdzxc 等级: 结帖率:100% | #4 得分:0 回复于: 2010-05-17 16:20:13 http://dev.csdn.net/article/36/36136.shtm 设置nmake,cl等的环境变量 不使用vs的IDE进行编译,直接使用nmake,cl等工具,在命令行下需要做许多工作: 1. 为了在命令行下直接使用nmake,需要将nmake的目录加到环境变量PATH; ...\Microsoft Visual Studio 8\VC\bin\ ...\Microsoft Visual Studio 8\Common7\IDE\ ----这下面有些dll是cl要用的 2. cl.exe使用CL,INCLUDE,LIBPATH这几个环境变量。添加INCLUDE到用户变量,里面存放需要用到的常用头文件位置,添加LIBPATH到用户变量,存放常用的库位置,如果需要的话: ...\Microsoft Visual Studio 8\VC\include\ ----下面有标准c库头文件,如stdio.h ...\Microsoft Visual Studio 8\VC\PlatformSDK\Include\ ---- 有windows.h等头文件 3. link.exe使用LIB变量: ...\Microsoft Visual Studio 8\VC\lib\ ...\Microsoft Visual Studio 8\VC\PlatformSDK\Lib\ 转载自http://mystixie.ycool.com/post.2020914.html |
对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 |
账号:cxdzxc昵称:cxdzxc关注 博客空间 最新帖子: 说说排查一个错误你所用过的最长... 浮点数之惑——printf("%x\n",6.... 求哪位好心人,把这个改成一个线... 更多 >> 取消关注 关注 cxdzxc cxdzxc 等级: 结帖率:100% | #5 得分:0 回复于: 2010-05-17 16:26:05 Nmake /f filename.mak NMAKE 选项 下表描述了 NMAKE 选项。选项前有斜杠 (/) 或短划线 (-),并且不区分大小写。使用 !CMDSWITCHES 更改生成文件或 Tools.ini 中的选项设置。 选项 用途 /A 强制生成所有已评估的目标,即使这些目标相对于依赖项未过期。不强制不相关目标的生成。 /B 即使时间戳相等,也强制生成。建议只用于非常快的系统(解析为两秒或小于两秒)。 /C 取消默认输出,包括非致命的 NMAKE 错误或警告、时间戳以及 NMAKE 版权信息。取消 /K 选项发出的警告。 /D 当目标不存在时,显示每个已评估的目标、依赖项和消息的时间戳。与 /P 选项一起用于调试生成文件。使用 !CMDSWITCHES设置或清除部分生成文件的 /D 选项。 /E 使环境变量重写生成文件宏定义。 /ERRORREPORT[NONE | PROMPT | QUEUE | SEND ] 如果 nmake.exe 在运行时失败,则可以使用 /ERRORREPORT 将有关这些内部错误的信息发送给 Microsoft。 有关 /ERRORREPORT 的更多信息,请参见 /errorReport(报告内部编译器错误)。 /F filename 将 filename指定为生成文件。空格或制表符可以位于 filename的前面。为每个生成文件指定一次 /F 选项。若要从标准输入提供生成文件,请为 filename指定短划线 (-),并按 F6 或 Ctrl+Z 结束键盘输入。 /G 显示 !INCLUDE 指令中包含的生成文件。有关更多信息,请参见生成文件预处理指令。 /HELP, /? 显示 NMAKE 命令行语法的简短摘要。 /I 忽略所有命令的退出代码。若要设置或清除部分生成文件的 /I 选项,请使用 !CMDSWITCHES。若要忽略部分生成文件的退出代码,请使用短划线 (-) 命令修饰符或 .IGNORE。如果两者都指定了,则重写 /K 选项。 /K 如果命令返回错误,则继续生成不相关的依赖项。同时发出警告并返回退出代码 1。默认情况下,如果有任一命令返回非零退出代码,NMAKE 将暂停。来自 /K 选项的警告被 /C 选项取消;如果两者都指定了,则 /I 选项重写 /K 选项。 /N 显示但不执行命令;执行预处理命令。不在递归 NMAKE 调用中显示命令。对于调试生成文件和检查时间戳很有用。若要设置或清除部分生成文件的 /N 选项,请使用 !CMDSWITCHES。 /NOLOGO 取消 NMAKE 版权消息。 /P 显示标准输出的信息(宏定义、推理规则、目标、.SUFFIXES 列表),然后运行生成。如果不存在任何生成文件和命令行目标,则只显示信息。与 /D 选项一起用于调试生成文件。 /Q 检查目标的时间戳;不运行生成。如果所有目标都是最新的,则返回零退出代码;如果有任何目标不是最新的,则返回非零退出代码。执行预处理命令。从批处理文件运行 NMAKE 时很有用。 /R 清除 .SUFFIXES列表并忽略在 Tools.ini 文件中定义的,或预定义的推理规则和宏。 /S 取消已执行命令的显示。若要取消部分生成文件中的显示,请使用 @命令修饰符或 .SILENT。若要设置或清除部分生成文件的 /S 选项,请使用 !CMDSWITCHES。 /T 更新命令行目标(或第一个生成文件目标)的时间戳并执行预处理命令,但不运行生成。 /U 必须与 /N 选项一起使用。转储内联 NMAKE 文件,以便 /N 输出可用作批处理文件。 /X filename 将 NMAKE 错误输出发送到 filename而不是标准错误。空格或制表符可以位于 filename的前面。若要将错误输出发送到标准输出,请为 filename指定短划线 (-)。不影响从命令到标准错误的输出。 /Y 禁用批模式推理规则。选定该选项后,所有批模式推理规则被视为常规推理规则 |
对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 |
取消关注 关注 cxdzxc cxdzxc 等级: 结帖率:100% | #6 得分:40 回复于: 2010-05-17 16:30:03 转自:http://cyinger-smiling.blogbus.com/logs/16826664.html 1.Dos下运行VC++自带的Nmake,设置路径 ========================================== 注:摘录侯俊杰--在 console mode 中使用 C/C++ 编译器,更多参照http://jjhou.csdn.net/article99-10.htm ●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 $@ |
相关文章推荐
- 怎么设置环境变量--linux
- linux编译源码问题 环境变量的设置
- Android NDK 编译FFmpeg(不需要复杂的环境变量设置)
- gcc编译过程、C语言编译过程分析、环境变量设置、linux文件夹结构和用途介绍、常用文件和目录的操作命令、文件类型
- Android系统编译环境变量的设置
- Linux交叉编译工具环境变量设置方法
- Ubuntu下的Qt库编译和环境变量设置
- 怎么设置环境变量
- Android 源码下载 编译 环境变量设置
- 为cuda设置环境变量,编译.cu文件时,加载库
- 解析交叉编译工具环境变量的设置
- WIN7怎么设置JAVA环境变量
- 交叉编译SDL 安装配置及环境变量的设置
- qt应用程序交叉编译到arm环境变量设置
- 命令行对编译环境设置及系统环境变量一览
- 在linux里怎么设置环境变量啊,用env可以看到所有的环境变量,那什么指令可以改它们啊
- VS .NET Framework csc.exe的编译环境变量设置(配置)
- java环境变量设置和命令行编译运行
- 怎么设置环境变量
- linux叉编译工具环境变量设置