Don't like this style? Click here to change it! blue.css
I've allocated the first 9 lectures of this course to learning C++ inside and out. The larger section is behind by one lecture, so this set of notes is probably the last we'll get to before moving into the heart of Data Structures.
With that in mind, Makefiles and Templates are topics which everyone putting C++ on a resume should know about.
This (make
) is a tool to help automate your build process. I want to demonstrate it to you for several reasons.
make
can lead to discussions about other build managers like cmake
or
autoconf
(and when you get into web dev grunt
or gulp
). In other words,
it is part of the canon.Compile Task 1: Go and make a workspace out of cisc220/more-modules. Build main.cpp
in the
traditional way.
Object Task 2: Now follow the instructions in the readme to create 4 object files
(main.o
, teacher.o
, student.o
, monk.o
) then build those
object files into an executable.
Delta Task 3: This one is subtle. Change student.cpp
to have a different
message. Now ONLY recompile student g++ -c student.cpp
. Now build the_world
like this:
g++ *.o -o the_world
and run it.
So that one was a bit nutty. Here is what happens. Each one of your files was compiled into an objectfile, and
then those get linked together into an executable. So if you think in this way you can add a change you make to
your project without having to recompile everything. (Notice, we didn't compile anything other that
student.cpp
.) This allows the above comic to be invalid for your employees (you will have
employees that compile one day, right?).
Make Task 4: Now run make
, then ./the_world
.
Not bad right?
Adjust Task 5: Adjust teacher.cpp
to a new message. Run
make
then ./the_world
.
Touch Task 6: Now type touch monk.cpp
followed by
make
.
make
keeps track of when a file has been altered. In this case our makefile does some deliberate
creation of object files. touch
is a *nix command for adjusting a files last modification date. It
pretends to "update" a file. So when we touched the monk make
thought we needed to rebuild the monk.
Clean Task 7: Now type make clean
. What happened?
So Makefiles are really just a systemic way of organizing your build process. The basic format is this:
TARGET : PREREQS
\tRECIPE LINE
\tRECIPE LINE
This is one of the odd places where you actually need a tab character. As recipe lines are recognized by the leading tab.
So a super simple Makefile might look like:
all:
g++ main.cpp monk.cpp student.cpp teacher.cpp
In that case, calling make
just calls that one simple line. Not a huge benefit other than saving
some typing.
Evaluation Task 8: So what would do you think happens when our Makefile got
called? What about make clean
?
Advanced Usage: There are some awesome Makefiles out there that make really complicated builds work like a charm. I would encourage you to spend some time looking at the documentation and a tutorial or two.
Or even this monster:
Let's use this monk/teacher/student example to move onto the next topic: classes with headers.
I've had many students ask me the "proper" way of using headers with classes. Like always there are many right ways and there are wrong ways.
The truth is that the entire header file will be copied into anything which includes it. The next simple truth is that a function can be used in three ways:
So a good convention is to have headers declare things, have *.cpp
files define them, and other
functions call them.
For classes, nothing really changes. Declare the methods and attributes and whether they are public or private
in the header. Then define the functions in a blah.cpp
file.
Speak Task 9: For each of our three person types add a function void
speak();
both to the header files and the definition in the CPP files. Have the three types speak
something appropriate for who they are. Call all three speak methods in main.cpp
.
The notes have templates in them but we glanced over them quickly. We might run out of time here too, but they are still very important to any C++ coders.
A template allows you to run a generic program, without having to specify the input type. Let's do an example:
Generic Task 10: Write a speak function which uses a template. Use your
function to have each different person in main.cpp
speak their own language.