如下Qt代码:
ConsoleDemo.pro
QT += core
QT -= gui
TARGET = ConsoleDemo
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
main.cpp
#include <QCoreApplication>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug() << "Hello World";
return a.exec();
}
使用qmake会生成对应的makefile
具体是这样的:
g++ -c -pipe -g -Wall -W -D_REENTRANT -fPIC -DQT_CORE_LIB -I../ConsoleDemo -I. -I/opt/Qt5.5.1/5.5/gcc_64/include -I/opt/Qt5.5.1/5.5/gcc_64/include/QtCore -I. -I/opt/Qt5.5.1/5.5/gcc_64/mkspecs/linux-g++ -o main.o ../ConsoleDemo/main.cpp
g++ -Wl,-rpath,/opt/Qt5.5.1/5.5/gcc_64 -Wl,-rpath,/opt/Qt5.5.1/5.5/gcc_64/lib -o ConsoleDemo main.o -L/opt/Qt5.5.1/5.5/gcc_64/lib -lQt5Core -lpthread
下面来解释下:
那个makefile就干了2件事情,1是编译,2是链接
首先看下第一条:
g++ -c -pipe -g -Wall -W -D_REENTRANT -fPIC -DQT_CORE_LIB
-I../ConsoleDemo
-I.
-I/opt/Qt5.5.1/5.5/gcc_64/include
-I/opt/Qt5.5.1/5.5/gcc_64/include/QtCore
-I.
-I/opt/Qt5.5.1/5.5/gcc_64/mkspecs/linux-g++
-o main.o ../ConsoleDemo/main.cpp
解析下各个参数的含义:
-c:生成文件;
-pipe:在不同的编译阶段使用管道替代临时文件;
-g:可执行程序包含调试信息,目的是给GDB等工具使用;
-Wall:编译后显示所有告警;
-W:默认报警也要显示;
-D_REENTRANT:它会对部分函数重新定义它们的可安全重入的版本;
-fPIC:用于生成位置无关的代码(Position-Independent-Code);
-DQT_CORE_LIB:这个没查到,但看名称差不多能猜到是QT核心库的调试;
-I:表示包含的include文件;
-o:表示编译成object文件。
第二条:
g++ -Wl,-rpath,/opt/Qt5.5.1/5.5/gcc_64 -Wl,-rpath,/opt/Qt5.5.1/5.5/gcc_64/lib
-o ConsoleDemo
main.o
-L/opt/Qt5.5.1/5.5/gcc_64/lib
-lQt5Core
-lpthread
解析下各个参数的含义:
-Wl, -rpath:①用于编译时指定间接引用的库位置,作用同-Wl,-rpath-link;②用于运行时指定所有引用库的位置,作用同修改环境变量(LD_LIBRARY_PATH),并且库路径引用优先级高于LD_LIBRARY_PATH;
-L:Link链接路径;
-l:链接到哪个so文件。