0

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

不能将 -o 与 -c、-S 或 -E 与多个文件一起指定

这是我的生成文件:

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}
4

2 回答 2

2

线

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.oand lateral.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就是抱怨的原因。

于 2013-04-23T12:46:07.723 回答
1

IMO(但现在无法测试)这条线有问题:

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

我认为-openmp=parallel应该只是-fopenmp。首先是因为这是 OpenMP 的正确编译标志,其次是因为后面的-o内容将被解释为输出文件的名称。正如您的错误消息所述,您不能一起使用-cand -o

于 2013-04-23T13:11:02.773 回答