There are actually a lot more than two files generated, but never mind that for now.
The situation is analogous to compiling any user space code. First, a .c file is transformed into object code, in a .o. Next, the .o code is linked together to produce a library or executable.
The situation is no different with Linux, except that the linker links against a custom linker script, and names its file .ko instead.