如下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