在本文中,将分享如何在树莓派2上编译一个Qt4程序。这不是一个关于如何安装所有必需组件的教程,因为没有这方面的记录,而且互联网上的解释已经足够了。如果能提供这个过程,将更新这篇文章。
以下是用于示例的文件:
需要向教授展示程序应用,但不想总是带着笔记本电脑去大学(它又重又大)。相反,决定带上树莓派2,它非常小且轻便。上一次的工作就是这里描述的Qt应用程序(数独游戏)。编程本身没有问题,但是在树莓派上编译它花费了很多时间。许多教程似乎都是半成品,或者/和对makefiles的了解几乎为零。因此,决定提供一个完全功能的makefile来使用。
使用Qt5创建了源文件,这使得有必要在pi上的include/qt4目录内创建一个链接:
sudo ln -s /usr/include/qt4/QtGui /usr/include/qt4/QtWidgets
在包含所有源文件的目录中创建一个名为“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++错误,确保:
基本上,一切都像是有一个纯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)