Understanding Makefile
Recently, I have been looking at some content related to network programming, where the project directory and the contents of the <span>makefile</span>
are as follows:

server:
g++ server.cpp -o server && g++ client.cpp -o client
Since I did not understand the meaning of this, I was wondering why the <span>server</span>
is needed.
I tried it myself, and if there is no <span>server:</span>
, it will throw an error.

I was also thinking, isn’t it necessary to compile two files? Why is there only one <span>server:</span>
?
With these questions, once you get the answers, you can better understand.
In the <span>Makefile</span>
, <span>server:</span>
is a target that instructs the <span>make</span>
tool to execute certain commands. The <span>Makefile</span>
file controls the build process by defining targets and corresponding rules.
1. Target:
<span>server:</span>
is a target name. In a <span>Makefile</span>
, targets are usually the files you want to generate or the operations you want to perform. For example, a target can be an executable file generated from compilation or a specific task. Here, the <span>server</span>
target typically represents the executable file you want to compile and generate named <span>server</span>
.
2. Rule:
The command under <span>server:</span>
<span>g++ server.cpp -o server && g++ client.cpp -o client</span>
is the rule for building that target. Specifically:
<span>g++ server.cpp -o server</span>
compiles the<span>server.cpp</span>
file and generates the<span>server</span>
executable file.<span>&&</span>
is a logical AND operator, indicating that the subsequent command will only execute if the preceding command is successful.<span>g++ client.cpp -o client</span>
compiles the<span>client.cpp</span>
file and generates the<span>client</span>
executable file.
Why is <span>server:</span>
needed?
<span>server:</span>
as a target can be executed as follows:
make server
This will trigger the <span>make</span>
to execute the rules related to <span>server:</span>
, which means compiling <span>server.cpp</span>
and <span>client.cpp</span>
.
You can think of it as a label that tells the <span>make</span>
what commands need to be executed to generate the <span>server</span>
target. If you do not have the <span>server:</span>
target, <span>make</span>
will not know how to handle the build process for <span>server</span>
.
Summary:
<span>server:</span>
is the target name.- The commands defined under it are the operations required to generate the
<span>server</span>
target. - Using
<span>make server</span>
will execute the build commands according to the rules under<span>server:</span>
.
Extension:
You can also define multiple targets. For example:
server:
g++ server.cpp -o server
client:
g++ client.cpp -o client
Then you can run them separately:
make server # Build server
make client # Build client
If you run <span>make</span>
without specifying a target, <span>make</span>
will default to executing the first target in the <span>Makefile</span>
.

As shown in the above image, if I write it separately and then directly run <span>make</span>
, it will only execute the first command, generating the <span>server executable file</span>
. Then it will end, and if I need to run the second command, I will need to use the <span>make client</span>
command.
Now, I believe everyone should be able to understand.