Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macros nmake基于目标修改宏_Macros_Nmake_Targets - Fatal编程技术网

Macros nmake基于目标修改宏

Macros nmake基于目标修改宏,macros,nmake,targets,Macros,Nmake,Targets,我有一个Makefile.mak,我可以选择从基于C的源代码创建一个test.exe或DLL。我正在使用CL.EXE和NMAKE 当目标为TEST.EXE时,我想这样修改我的CFLAGS宏: CFLAGS = $(CFLAGS) -DMAIN 当然,我在我的C代码中使用了这个: #ifdef MAIN ... int main()... yada yada #endif 我试过了 !IF $@ == "test.exe" 但是它崩溃了,并且在逻辑上无法工作,因为$@,target在make

我有一个Makefile.mak,我可以选择从基于C的源代码创建一个test.exe或DLL。我正在使用CL.EXE和NMAKE

当目标为TEST.EXE时,我想这样修改我的CFLAGS宏:

CFLAGS = $(CFLAGS) -DMAIN
当然,我在我的C代码中使用了这个:

#ifdef MAIN
... int main()... yada yada
#endif
我试过了

!IF $@ == "test.exe"
但是它崩溃了,并且在逻辑上无法工作,因为$@,target在makefile的该部分中不是确定性的

定义附加宏的逻辑位置是在定义目标时,但如果不将其解释为DOS命令,我看不出如何执行该操作

test.exe: test.obj
  CFLAGS = $(CFLAGS) -DMAIN
  $(LINKER) /out:$@ $(LIB) $*.obj $(LIBS)

我知道,有了gmake会更容易。我没有这个选择。

我将介绍两种解决方案:一种是根据您的要求,即根据目标修改
CFLAGS
,另一种可能是更好的方法

假设您有一个文件
multiply.c

#include <stdio.h>

int multiply(int a, int b) {
   return a * b;
}

#ifdef MAIN
int main() {
   printf("Unit test: multiply(2, 3) = %d\n", multiply(2, 3));
}
#endif
如果定义了
RECURSE
,则使用内置规则创建测试程序
multiply.exe

这个解决方案有效。但它要求每次使用时都重新生成
multiply.obj
,因为它有两个版本:一个带有
main
,另一个没有

第二种解决方案区分这些对象文件

TARGETS = my_lib.lib multiply.exe
CFLAGS  = -W4 -O2 -nologo -Zi

all: $(TARGETS)
my_lib.lib: multiply.obj
multiply.exe: $*.TEST_obj

my_lib.lib:
    lib -nologo -out:$@ $**

multiply.exe:
    link -nologo -out:$@ $**

.c.TEST_obj:
    $(CC) -DMAIN $(CFLAGS) -c $< -Fo$@
尝试直接从
.c
文件创建
.exe
文件,如中所示:

.c.exe:
    $(CC) -DMAIN $(CFLAGS) $<
.c.exe:
$(CC)-DMAIN$(CFLAGS)$<
不起作用,因为这仍然会创建一个.obj文件,该文件会对其他版本造成冲击


编辑:
。后缀:。似乎不需要TEST_obj

我将提供两种解决方案:一种是按照您的要求执行,即根据目标修改
CFLAGS
,另一种可能是更好的方法

假设您有一个文件
multiply.c

#include <stdio.h>

int multiply(int a, int b) {
   return a * b;
}

#ifdef MAIN
int main() {
   printf("Unit test: multiply(2, 3) = %d\n", multiply(2, 3));
}
#endif
如果定义了
RECURSE
,则使用内置规则创建测试程序
multiply.exe

这个解决方案有效。但它要求每次使用时都重新生成
multiply.obj
,因为它有两个版本:一个带有
main
,另一个没有

第二种解决方案区分这些对象文件

TARGETS = my_lib.lib multiply.exe
CFLAGS  = -W4 -O2 -nologo -Zi

all: $(TARGETS)
my_lib.lib: multiply.obj
multiply.exe: $*.TEST_obj

my_lib.lib:
    lib -nologo -out:$@ $**

multiply.exe:
    link -nologo -out:$@ $**

.c.TEST_obj:
    $(CC) -DMAIN $(CFLAGS) -c $< -Fo$@
尝试直接从
.c
文件创建
.exe
文件,如中所示:

.c.exe:
    $(CC) -DMAIN $(CFLAGS) $<
.c.exe:
$(CC)-DMAIN$(CFLAGS)$<
不起作用,因为这仍然会创建一个.obj文件,该文件会对其他版本造成冲击

编辑:
。后缀:。似乎不需要测试对象