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

2023-05-16

如下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文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐