我有一个项目需要计算多个情况,所有情况都使用相同的标头和依赖项。目录层次结构就是这样。
/src/Chapter_4/Exercise_4.7.cpp
/src/Chapter_4/Exercise_4.9.cpp
/src/Chapter_4/Exercise_4.12.cpp (etc...)
/src/Chapter_4/Makefile
/src/header1.h
/src/header2.h (etc...)
我想让单个Makefile让我运行命令“make Exercise_4。(what)”并编译该特定的Exercise文件。每次我想编译不同的练习时,我真的不想编辑Makefile。
请记住,我使用make文件非常非常新。
答案 0 :(得分:0)
我认为这样的事情会起作用
%: %.cpp
g++ $< -I../ -o $@
规则名称与cpp文件相同。因此,如果您想编译Excercise_4.cpp,只需使用make Excercise_4
。 $<
引用您的输入参数,$@
到目标名称。
答案 1 :(得分:0)
根据您的依赖关系(或缺少依赖关系),您根本不需要编写Makefile。只需做:
private class createNewStudentListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
try
{
Student s = new Student(enterFirstName.getText(), enterLastName.getText());
File newStudent;
newStudent = new File("Students.bin");
FileOutputStream outStream = new FileOutputStream("Students.bin", newStudent.exists());
ObjectOutputStream objectOutputFile = new ObjectOutputStream(outStream);
objectOutputFile.writeObject(s);
JOptionPane.showMessageDialog(null, "The new student was added successfully");
String id = Integer.toString(s.getID());
IDNUM.setText(id);
s = null;
objectOutputFile.close();
}
catch (emptyString a)
{
JOptionPane.showMessageDialog(null, a.getMessage());
} catch (Exception a) {
JOptionPane.showMessageDialog(null, a.getMessage());
}
}
}
...与$ cd /src/Chapter_4
$ make Exercice_4.x
匹配您要编译的文件之一就足够了,因为Make有很多内置的隐式规则,并且它有一个从源文件编译可执行文件同名。
你可以这样做:
x
...输出是:
$ make -p | grep -C2 "%.cpp"
使用类似的命令,我们看到%: %.cpp
# recipe to execute (built-in):
$(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@
扩展为$(LINK.cpp)
,扩展为$(LINK.cc)
。
因此,当您致电$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
时,它会执行以下内容:
make Exercice_4.19
如果您愿意,可以说,添加警告标志或使用某个标准版本,您可以直接添加标记:
g++ Exercice_4.19.cpp -o Exercice_4.19
或者将它写在你的Makefile中:
$ make Exercice_4.19 CXXFLAGS="-std=c++11 -Wall"
g++ -std=c++11 -Wall Exercice_4.19.cpp -o Exercice_4.19
然后像以前一样打电话:
CXXFLAGS := -std=c++11 -Wall
对于这么简单的任务,你根本不需要为编写规则而烦恼。