Most of profile directives are transformed to command line options for compiler and linker. The INCLUDEPATH directories are added to the INCLUDE parameter of the compiler. LIBS is not intended for object files but for user specified libraries (you do not have any in your small project). The contents of LIBS is passed to the linker. Well, you can (ab)use LIBS for passing additional object files. They will be processed by the linker, too. The SOURCES and HEADERS directives specify, which source and header files are known to the Creator. These files will be processed.

Do not "do it manually", even if you lose your profile file. Compiling your app is not so straightforward. First, a makefile is created or updated. Then, there is MOC compiler which will process GUI classes. Also, resources will be converted to binary files. Then, the makefile will be executed. Updated source files will be compiled and all object files, along with libraries, will be linked to the resulting app, library or dll.

Write only the "kernel" of the profile file and let the Qt environment to manage the rest. This way, you avoid blunders, linking invalid object files, ignoring needed files and talking about "missing files" and "unresolved references". Note that all files belonging to your project are in the directory tree. If some file isn't there and it should be processed then you need to add the file even if you aren't about to modify it.

As to the mat.o file: Placing the file on the LIBS directive causes treating mat.o as an external library. Even if you change the source, the old object file from elab_c_proj will be linked. If you add mat.cpp to the project, you get duplicate references most likely: the same public is offered by the mat.o processed during compiling your project and by the old mat.o in elab_c_proj. This is surely nothing you tried to achieve.