【问题标题】:No rule to make target 'openmp'?没有规则使目标'openmp'?
【发布时间】:2015-08-26 17:33:27
【问题描述】:

makefile 中定义了以下内容:

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

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

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

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

【问题讨论】:

    标签: makefile openmp options compiler-flags


    【解决方案1】:

    这里的问题是-std=c++11-fopenmp 之间的空格。它将这两个参数拆分,-fopenmp 被解释为选项-f,然后openmp 被解释为makefilemake 试图构建它,因为它在当前目录中找不到它。

    你需要用引号(")来执行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 之间有空格。我明白了

    $ 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
    

    注意没有空格,或等价于

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

    再次没有空格。

    【讨论】:

    • 谢谢!把它写成字符串效果很好!问题中 CXXFLAGS 之后的空格是错字,我已经更正了! :)
    • 不打扰,很高兴为您提供帮助。
    【解决方案2】:

    太空 - 最后的边疆。你需要引号

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

    shell 在由空格分隔的单词边界处拆分命令行单词。引用用于避免分词。

    【讨论】:

      猜你喜欢
      • 2016-08-25
      • 1970-01-01
      • 2019-07-27
      • 2012-02-20
      • 2013-06-14
      • 2012-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多