您现在的位置是:首页 >技术交流 >C/C++笔记-写一个Makefile并链接QtCore库使用QString,QDebug网站首页技术交流

C/C++笔记-写一个Makefile并链接QtCore库使用QString,QDebug

IT1995 2023-04-24 20:18:51
简介C/C++笔记-写一个Makefile并链接QtCore库使用QString,QDebug

如下cpp代码,调用QDebug打印程序:

#include <QDebug>
#include <QString>


int main(int argc, char *argv[]){

        QString testStr = "hello";
        qDebug() << testStr;

        return 0;
}

如下makefile:

test: main.cpp
        g++ -c -I/opt/Qt5.5.1/5.5/gcc_64/include -I/opt/Qt5.5.1/5.5/gcc_64/include/QtCore -o main.o main.cpp

先进行编译,发现编译报错:

 

报错的地方是qglobal.h从中可以知道,如果想要使用Qt,在编译时需要添加-fPIC选项,

-fPIC:用于生成位置无关的代码(Position-Independent-Code);

添加此选项,并且把链接的命令加上:

Test: main.cpp
        g++ -c -fPIC -I/opt/Qt5.5.1/5.5/gcc_64/include -I/opt/Qt5.5.1/5.5/gcc_64/include/QtCore -o main.o main.cpp
        g++  -o TestQt main.o -L/opt/Qt5.5.1/5.5/gcc_64/lib -lQt5Core                                                   

此时编译没有问题了,但链接会有如下问题:

 估计是环境有问题,在Makefile中添加-Wl,-rpath设置环境变量。

-Wl, -rpath:①用于编译时指定间接引用的库位置,作用同-Wl,-rpath-link;②用于运行时指定所有引用库的位置,作用同修改环境变量(LD_LIBRARY_PATH),并且库路径引用优先级高于LD_LIBRARY_PATH;

完整makefile如下:

Test: main.cpp
        g++ -c -fPIC -I/opt/Qt5.5.1/5.5/gcc_64/include -I/opt/Qt5.5.1/5.5/gcc_64/include/QtCore -o main.o 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 TestQt main.o -L/opt/Qt5.5.1/5.5/gcc_64/lib -lQt5Core

这时编译、链接、运行都正常了:

现在程序是能跑了,但这个makefile写得有点拉跨。

下面重新构造个makefile,让这个makefile看起来像稍微有点工作经验的人写的。

PROGRAM = TestQt
OBJECTS = main.o
SOURCE := $(wildcard *.cpp)

LINK = g++
LFLAGS = -c -fPIC
INCPATH = -I/opt/Qt5.5.1/5.5/gcc_64/include -I/opt/Qt5.5.1/5.5/gcc_64/include/QtCore

CXX = g++
CXXFLAGS = -Wl,-rpath,/opt/Qt5.5.1/5.5/gcc_64 -Wl,-rpath,/opt/Qt5.5.1/5.5/gcc_64/lib
LIBS = -L/opt/Qt5.5.1/5.5/gcc_64/lib -lQt5Core

$(OBJECTS): $(SOURCE)
        $(LINK) $(LFLAGS) $(INCPATH) -o $@ $<
        $(CXX) $(CXXFLAGS) -o $(PROGRAM) $@ $(LIBS)


.PHONY: clean
clean:
        rm -f *.o $(PROGRAM) 

解释其中的几点:

①wildcard:匹配,获取当前目录所有.cpp文件

②$@:获取标签“:”冒号前面的字符串;

③$<:获取标签“:”冒号后也就是$(SOURCE)的一条数据,相当于循环遍历那样,依次运行这条命令。

源码打包下载地址:

https://github.com/fengfanchen/CAndCPP/tree/master/MakefileQtConsole

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。