在 make 目标中设置 C 宏?

use*_*670 2 macros makefile

我的代码包含可以使用宏启用或禁用的各个部分。这可以通过代码中的#ifdef/#endif、makefile 中的-D 选项以及通过设置宏调用make 来完成。例子:

make DOMP=-DUSE_OMP
Run Code Online (Sandbox Code Playgroud)

在生成文件中

calco.o: calco.cpp calco.h
    $(CC) calco.cpp -o calco.o $(DOMP)
Run Code Online (Sandbox Code Playgroud)

在代码中

#ifdef USE_OMP
#pragma omp parallel for
#endif
    for (i =0; i < N; i++) {
       ...
    }
Run Code Online (Sandbox Code Playgroud)

我有很多可以设置的可能的宏,并且希望能够通过制作不同的目标来设置这些宏。例如

make calc_abc
Run Code Online (Sandbox Code Playgroud)

将使用一组特定的宏构建我的应用程序,而

make calc_xyz
Run Code Online (Sandbox Code Playgroud)

将使用一组不同的宏来做到这一点。

我在我的 makefile 中尝试了不同的方法,但没有发现任何有效的方法。这样的事情可能吗?

Mad*_*ist 5

您可以为此使用特定于目标的变量。特定于目标的变量的特征之一是它们由其先决条件继承。所以:

calc_abc : CPPFLAGS += -DUSE_ABC
calc_xyz : CPPFLAGS += -DUSE_XYZ

calc_abc : calc
calc_xyz : calc

calc: foo.o bar.o
Run Code Online (Sandbox Code Playgroud)

当然,这里的技巧是您必须确保make clean在这些不同类型的构建之间运行,否则您将获得以不同方式构建的对象的混杂。如果您认为您通常希望以不同的方式构建并共存,那么通常您会选择根据类型将目标文件放在不同的子目录中。那么他们就不会互相干扰了。