Macros nmake基于目标修改宏
我有一个Makefile.mak,我可以选择从基于C的源代码创建一个test.exe或DLL。我正在使用CL.EXE和NMAKE 当目标为TEST.EXE时,我想这样修改我的CFLAGS宏: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
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文件,该文件会对其他版本造成冲击
编辑:。后缀:。似乎不需要测试对象