> 文章列表 > C/C++笔记-记录一次对qmake生成的Makefile的分析(2023-02-07)

C/C++笔记-记录一次对qmake生成的Makefile的分析(2023-02-07)

C/C++笔记-记录一次对qmake生成的Makefile的分析(2023-02-07)

如下Qt代码:

ConsoleDemo.pro

QT += core
QT -= guiTARGET = ConsoleDemo
CONFIG += console
CONFIG -= app_bundleTEMPLATE = appSOURCES += 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文件。