看来你还不大明白编译器这个东西到底是咋回事。
首先,头文件是用来声明的,就是告诉编译器有这个函数或者这个类,至于函数的实现在哪儿,我头文件管不着,可能在.o文件里,也可能在.a或者.so的库里,你编译器在连接的时候按照设置的路径自己找去。而.cpp文件是用来实现的,就是把头文件声明过的函数用代码实现出来,在编译的时候被编译器编译为.o文件。当你的编译完成以后,连接器负责把你的工程里的所有用到的函数,按照设置的查找路径,统统连接到一起,不管这些函数的实现是在标准库里还是在你工程中由.cpp生成的.o文件里。最后生成都是机器码的二进制的可执行程序。
编译和连接是两个步骤,要弄明白。如果调用库函数,编译的时候只用到了库函数的头文件,连接的时候才会用到库。
而上面的头文件、cpp和库之间的关系,是通过makefile来管理的,makefile告诉编译器如何编译工程,到哪里去找头文件和库文件。不管你用什么集成开发环境,到最后都要用这个makefile来编译工程。
以前我们都要自己写makefile,这是件很麻烦的事,但是自从有了qmake工作就轻松多了。Qt里面的qmake就是用来帮助你生成makefile的,写.pro文件要比直接写makefile文件容易多了。
至于Qt里面的uic和moc,这些是预编译器,uic负责将.ui文件转化成.h和.cpp文件,而moc负责将所有含有Q_OBJECT宏的文件翻译成编译器可以编译的.cpp文件,因为Q_OBJECT这个宏编译器不认识,它是Qt自己定义的。最终交给编译器处理的都是编译器能够编译的.h和.cpp文件。
不知道我说明白没有。