C++ 获取makefile以更改输出可执行文件名

C++ 获取makefile以更改输出可执行文件名,c++,makefile,C++,Makefile,我正在为一个学校作业写一个makefile,我遇到了一些问题。我似乎无法使用-o标志将输出可执行文件命名为我想要的名称。相反,它创建了一个名为a.out的可执行文件(该文件运行正常) 当我使用“makeclean”命令时,它告诉我我想要的可执行文件名不存在。我对“make”命令如何不能识别程序名和“makeclean”命令如何识别程序名感到困惑。如有任何反馈,将不胜感激 PROGRAM = osuSystem CXX = g++ CXXFLAGS = -std=c++0x SOURCE

我正在为一个学校作业写一个makefile,我遇到了一些问题。我似乎无法使用-o标志将输出可执行文件命名为我想要的名称。相反,它创建了一个名为a.out的可执行文件(该文件运行正常)

当我使用“makeclean”命令时,它告诉我我想要的可执行文件名不存在。我对“make”命令如何不能识别程序名和“makeclean”命令如何识别程序名感到困惑。如有任何反馈,将不胜感激

 PROGRAM = osuSystem
 CXX = g++
 CXXFLAGS = -std=c++0x

 SOURCES = $(wildcard *.cpp)
 OBJECTS = $(SOURCES:.cpp=.o)
 HEADERS = $(wildcard *.hpp)

 default: ${OBJECTS}
       ${CXX} ${CXXFLAGS} ${OBJECTS} ${HEADERS] ${SOURCES} -o ${PROGRAM}

 clean:
       rm ${OBJECTS} ${PROGRAM}

您的
default:${OBJECTS}
行告诉make将所有源代码编译成
.o
文件,因此下一行只需链接
.o
文件,不应提及源文件:

default: ${OBJECTS}
        ${CXX} ${CXXFLAGS} ${OBJECTS} -o ${PROGRAM}

我在本地重现了你的问题,这一改变使它起了作用。对于clean,您应该使用
rm-f
,这样当您运行
clean
时,当要删除的某些对象/程序不存在时,它不会抱怨并删除那些确实存在的对象/程序。

如果将
-o${program}
移到前面,会有什么区别吗
-o${PROGRAM}${CXX}${cxflags}…
选项意味着只创建
-c
文件。你在哪里看到的?@Barmar Make知道如何将.cpp文件编译成.o文件,并且当你将对象指定为目标的依赖项时,它会隐式地进行编译;上面,相关目标是“
默认值”
”。如果
default
依赖于
${SOURCES}
而不是
${OBJECTS}
,那么
default
构建步骤将需要显式编译
.cpp
s。