我正确使用C++的Makefile吗?

0 c++ makefile

Makefile文件

 default:
   (!)  g++ -Werror  -Wunused-variable -Wunused-value  -Wunused-function -Wfloat-equal -Wall -ansi -o main  -pedantic-errors main.cpp
        '/home/HomeName/Desktop/main'
Run Code Online (Sandbox Code Playgroud)

我一直在使用这段代码来编译C++文件.这是在makefile中使用此代码的好方法吗?此外,我想知道标有(!)的行是否具有正确顺序的编译器选项.

Jon*_*ler 5

所以,我相信你的makefile本身不包含'(!)'标记.

你有什么'有用'.它使用一组严格的选项编译程序,然后通过绝对路径名运行它.

但是,它不是很灵活:

  • 它只会main在你跑的时候建立make
  • main即使你刚刚建造它,它也会一直建造
  • 如果你运行make main,它将使用一组不同的命令来构建程序,它将不会运行该程序.

它会更好 - 它可以让你更容易地移动代码 - 如果运行程序的行使用当前目录.

如果你使用make的一些内置功能会更好.

C++和C编译器非常容忍各种选项的订单; 你有什么是好的.

在内部make,C++编译器由宏CXX知道; 它需要一组由CXXFLAGS定义的标志.因此,您可以使用:

CXX = g++
CXXFLAGS_W = -Werror -Wunused-variable -Wunused-value -Wunused-function \
             -Wfloat-equal -Wall
CXXFLAGS_M = -ansi  -pedantic-errors
CXXFLAGS   = ${CXXFLAGS_M} ${CXFLAGS_W}

all:    main
        ./main
Run Code Online (Sandbox Code Playgroud)

这允许您运行make,make allmake main和获得项目main建设.如果您使用前两个中的任何一个,程序也将运行.如果源自上次编译后已更改,它将仅重新编译该程序.如果你在目录中有其他程序,比如说'exercise2.cpp'和'exercise3.cpp',那么你就可以说了make exercise2 exercise3,现在这些程序的编译方式与之相同main.

如果你真的想在构建之后运行该程序(可能不是你长期做的事情),那么你可能会重写编译规则(假设GNU Make):

% : %.cpp
        ${CXX} ${CXXFLAGS} -o $@ $*.cpp
        ./$@
Run Code Online (Sandbox Code Playgroud)

如果你有经典或POSIX变体make,你会写:

.cpp:
        ${CXX} ${CXXFLAGS} -o $@ $*.cpp
        ./$@
Run Code Online (Sandbox Code Playgroud)

使用' %' 的符号在可用时更灵活.