没有制定目标'openmp'的规则?

No rule to make target 'openmp'?

makefile 中定义如下:

CXX = g++
CXXFLAGS = -std=c++11

我想使用 OpenMP 指令编译我的代码而不更改原始 makefile(运行 非常完美)。该手册建议了一种方法来执行此操作,即在命令行上更改它。然而,当我 运行,

 make CXXFLAGS=-std=c++11 -fopenmp

弹出之前提到的错误。有人可以帮助我了解我做错了什么吗?

Space - 最后的边界。您需要引号

make CXXFLAGS="-std=c++11 -fopenmp"

shell 在以白色 space 分隔的单词边界处拆分命令行单词。引用用于避免分词。

这里的问题是 -std=c++11-fopenmp 之间的 space。它将这两个参数分开,-fopenmp 被解释为选项 -f,然后 openmp 被解释为 make 尝试构建的 makefile,因为它可以在当前目录下找不到。

你需要用引号(")执行make,比如

$ make CXXFLAGS="-std=c++11 -fopenmp"

这会将 CXXFLAGS= -std=c++11 -fopenmp 传递给 make。我们可以通过以下简单的 makefile.

看到这种行为
CXX = g++
CXXFLAGS = -std=c++11

all:
    @echo $(CXXFLAGS)

运行 make 将产生输出

$ make
-std=c++11

运行 make CXXFLAGS="-std=c++11 -fopenmp" 会产生

$ make
-std=c++11 -fopenmp

正确的输出和我们希望实现的目标。


顺便说一句,命令 make CXXFLAGS= -std=c++11 -fopenmp 在你的问题中应该产生比

更多的错误
make: openmp: No such file or directory
make: *** No rule to make target 'openmp'.  Stop.

因为 CXXFLAGS=-std=c++11 之间的 space。我得到

$ make CXXFLAGS= -std=c++11 -fopenmp
make: invalid option -- =
make: invalid option -- c
make: invalid option -- +
make: invalid option -- +
make: invalid option -- 1
make: invalid option -- 1

例如,如果您想使用 -std=c++14 而不是 -std=c++11 进行编译,则需要使用

执行 make
$ make CXXFLAGS=-std=c++14

注意无space,或等同于

$ make CXXFLAGS="-std=c++14"

再次没有 space。