我有一个问题,包括并行计算与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.o
和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
抱怨的。
IMO(但现在无法测试)这一行有问题:
CFLAGS = -c -C -O3 -openmp=parallel
我认为-openmp=parallel
应该是-fopenmp
。首先因为这是OpenMP的正确编译标志,其次因为-o
之后的内容将被解释为输出文件的名称。正如您的错误信息所说,您不能同时使用-c
和-o
。