Makefile with OpenMP:不能用-c、-S或-E指定多个文件的-o



我有一个问题,包括并行计算与OpenMP在我的makefile。我得到的错误是

不能用-c、-S或-E指定多个文件

这是我的makefile:

GSLFLAGS := pkg-config --cflags gsl
LIBGSL := pkg-config --libs gsl
CFLAGS = -c -C -O3 -openmp=parallel
lateral.o:lateral.cxx
    g++ -c lateral.cxx 
main.o:main.cxx 
    g++ -c main.cxx  $< ${GSLFLAGS} ${CFLAGS}
alg:main.o lateral.o
    g++ -o  $@ $^ ${LIBGSL}

g++ -c main.cxx $< ${GSLFLAGS} ${CFLAGS}

应该读

g++ -c main.cxx ${GSLFLAGS} ${CFLAGS}

是因为$<展开为第一个前提条件main.cxx,得到g++ -c main.cxx main.cxx。为了避免这种情况,您甚至可以编写像

这样的通用规则:
%.o: %.cxx
    g++ -c -o $@ ${GSLFLAGS} ${CFLAGS} $^

您不需要main.olateral.o的特殊规则,完整的生成文件将是:

GSLFLAGS := pkg-config --cflags gsl
LIBGSL := pkg-config --libs gsl
all: alg
%.o: %.cxx
    g++ -c -o $@ ${GSLFLAGS} ${CFLAGS} $^
alg: main.o lateral.o
    g++ -o  $@ $^ ${LIBGSL}

您可以在这里找到上面语法的详细解释,或者在这里找到更详细的文档。

编辑:

对不起,我错过了C标志,这里也有一个错误:

CFLAGS = -c -C -O3 -openmp=parallel

你应该删除-c,因为你已经在规则中使用它,这就是gcc抱怨的。

IMO(但现在无法测试)这一行有问题:

CFLAGS = -c -C -O3 -openmp=parallel

我认为-openmp=parallel应该是-fopenmp。首先因为这是OpenMP的正确编译标志,其次因为-o之后的内容将被解释为输出文件的名称。正如您的错误信息所说,您不能同时使用-c-o

最新更新