我遇到一个问题,包括在makefile中使用OpenMP进行并行计算。我得到的错误是
无法使用多个文件指定带-c,-S或-E的-o
这是我的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}
答案 0 :(得分: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.o
和lateral.o
的特殊规则,完整的makefile将是:
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}
您可以找到上面here语法的详细说明或更详细的文档here。
修改强>:
抱歉,我错过了C标志,那里也有错误:
CFLAGS = -c -C -O3 -openmp=parallel
您应该删除-c
,因为您已在规则中使用它,这是gcc
正在抱怨的内容。
答案 1 :(得分:1)
IMO(但现在无法测试)这条线有问题:
CFLAGS = -c -C -O3 -openmp=parallel
我认为-openmp=parallel
应该是-fopenmp
。首先,因为这是OpenMP的正确编译标志,其次是因为-o
之后的内容将被解释为输出文件的名称。正如您的错误消息所示,您无法一起使用-c
和-o
。