在树莓派2上编译Qt4程序

在本文中,将分享如何在树莓派2上编译一个Qt4程序。这不是一个关于如何安装所有必需组件的教程,因为没有这方面的记录,而且互联网上的解释已经足够了。如果能提供这个过程,将更新这篇文章。

文件结构

以下是用于示例的文件:

  • main.cpp - 包含Qt调用,但不定义Qt类
  • numberplacedoc.cpp - 纯C++文件,包含程序逻辑
  • numberplacedoc.h
  • numberplaceview.cpp - 实现新的Qt类(继承自QtMainWindow)
  • numberplaceview.h - 定义新的Qt类(继承自QtMainWindow)
  • ui_numberplaceview.h - 指定窗口布局

需要向教授展示程序应用,但不想总是带着笔记本电脑去大学(它又重又大)。相反,决定带上树莓派2,它非常小且轻便。上一次的工作就是这里描述的Qt应用程序(数独游戏)。编程本身没有问题,但是在树莓派上编译它花费了很多时间。许多教程似乎都是半成品,或者/和对makefiles的了解几乎为零。因此,决定提供一个完全功能的makefile来使用。

使用代码

使用Qt5创建了源文件,这使得有必要在pi上的include/qt4目录内创建一个链接:

sudo ln -s /usr/include/qt4/QtGui /usr/include/qt4/QtWidgets

创建Makefile

在包含所有源文件的目录中创建一个名为“makefile”的新文件。

设置编译器、包含目录、库目录等。

COMPILER=arm-linux-gnueabihf-g++ INCLUDEDIR = ./ INCLUDEDIR += /usr/include/qt4/ INCLUDEDIR += /usr/include/qt4/Qt INCLUDEDIR += /usr/include/qt4/QtGui INCLUDEDIR += /usr/include/qt4/QtCore LIBRARY += QtCore QtGui LIBRARYDIR = /usr/lib/arm-linux-gnueabihf LIBRARYDIR +=/usr/local/lib XLINK_LIBDIR = /lib/arm-linux-gnueabihf XLINK_LIBDIR += /usr/lib/arm-linux-gnueabihf XLINK_LIBDIR += /usr/local/lib/ INCDIR = $(patsubst %,-I%,$(INCLUDEDIR)) LIBDIR = $(patsubst %,-L%,$(LIBRARYDIR)) LIB = $(patsubst %,-l%,$(LIBRARY)) XLINKDIR = $(patsubst %,-Xlinker -rpath-link=%,$(XLINK_LIBDIR)) CPPSTD = -std=c++11 OPT = -O0 DEBUG = -g WARN= -Wall PTHREAD= -lpthread SPECIAL_LINK_OPTIONS = COMPILE_FLAGS = $(OPT) $(DEBUG) $(WARN) $(INCDIR) $(CPPSTD) COMPILE = $(COMPILER) $(COMPILE_FLAGS) -c LINK_FLAGS= $(LIBDIR) $(LIB) $(XLINKDIR) $(PTHREAD) $(SPECIAL_LINK_OPTIONS) LINK = $(COMPILER) $(LINK_FLAGS) EXECUTABLE = executable

首先,将手动编译一切,以更好地了解正在发生的事情。

NPD=numberplacedoc NPV=numberplaceview OBJ_FILES = $(NPD).o $(NPV).o main.o $(NPV).moc.o all: $(OBJ_FILES) $(LINK) $(OBJ_FILES) -o $(EXECUTABLE) $(NPD).o: $(NPD).cpp $(NPD).h $(COMPILE) $(NPD).cpp main.o: main.cpp $(COMPILE) main.cpp $(NPV).o: $(NPV).cpp $(NPV).h $(COMPILE) $(NPV).cpp $(NPV).moc.o: $(NPV).moc.cpp $(COMPILE) $(NPV).moc.cpp $(NPV).moc.cpp: $(NPV).h moc-qt4 $(NPV).h -o $(NPV).moc.cpp

错误处理

如果遇到“奇怪的”错误,比如undefined reference to QApplication virtual call inside the ctor和dtor,或者其他奇怪的C++错误,确保:

  • numberplaceview.moc.cpp正确编译
  • numberplaceview.moc.o存在
  • numberplaceview.moc.o在链接列表中

解释

基本上,一切都像是有一个纯C++程序。只是,创建了一个特殊的新cpp文件,由qt4编译器创建,需要进入链接列表。这就是构建过程的全部魔法。

泛化(实用化)构建命令

OUTPUT_PATH = ./ EXECUTABLE := $(OUTPUT_PATH)executable TMP_DIR=tmp/ H_FILES_FOR_QT := $(wildcard *view.h) H_FILES_FOR_QT += $(wildcard qt*.h) H_FILES_FOR_QT := $(filter-out $(wildcard ui_*), $(H_FILES_FOR_QT)) CPP_FILES_TO_GEN := $(H_FILES_FOR_QT:.h=.moc.cpp) .SECONDARY: $(CPP_FILES_TO_GEN) CPP_FILES := $(wildcard *.cpp) $(CPP_FILES_TO_GEN) OBJECT_FILES := $(addprefix $(TMP_DIR),$(CPP_FILES:.cpp=.o)) all: $(TMP_DIR) linkAll $(TMP_DIR): @mkdir $(TMP_DIR) linkAll: $(OBJECT_FILES) @$(LINK) $? -o $(EXECUTABLE) $(TMP_DIR)%.o: %.cpp @$(COMPILE) $< -o $@ %.moc.cpp: %.h @moc-qt4 $< -o $@ clean: @rm -f $(TMP_DIR)* @rm -f $(CPP_FILES_TO_GEN) @rm -f $(EXECUTABLE)
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485