Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用自定义Makefile而不是qmake交叉编译Ubuntu-Win7_C++_Qt_Makefile_Cross Compiling_Mxe - Fatal编程技术网

C++ 使用自定义Makefile而不是qmake交叉编译Ubuntu-Win7

C++ 使用自定义Makefile而不是qmake交叉编译Ubuntu-Win7,c++,qt,makefile,cross-compiling,mxe,C++,Qt,Makefile,Cross Compiling,Mxe,我有一个项目,它使用Qt4,没有附加库和QtSql(用于处理SQLLite数据库),我想为x86_64 Windows 7机器交叉编译它。这是我总结的makefile(除了main.cpp之外,它只使用.hpp文件,因为我使用了很多模板): CXX=g++-4.8 CXXFLAGS=-std=c++11-pedantic-Wall-pedantic errors-Wextra IPATH=-I/usr/include/qt4/-I/usr/include/qt4/QtGui-I/usr/incl

我有一个项目,它使用Qt4,没有附加库和QtSql(用于处理SQLLite数据库),我想为x86_64 Windows 7机器交叉编译它。这是我总结的makefile(除了main.cpp之外,它只使用.hpp文件,因为我使用了很多模板):

CXX=g++-4.8
CXXFLAGS=-std=c++11-pedantic-Wall-pedantic errors-Wextra
IPATH=-I/usr/include/qt4/-I/usr/include/qt4/QtGui-I/usr/include/qt4/QtSql
LDFLAGS=-lQtGui-lQtSql-lQtCore
OBJS=main.o
HEADERS=mymoc1.hpp mymoc2.hpp其他HEADERS
全部:myexec
myexec:$(OBJS)
$(CXX)$(CXXFLAGS)$(OBJS)-o$@$(LDFLAGS)
main.o:main.cpp$(标题)
$(CXX)-c$(CXXFLAGS)$<-o$@$(IPATH)
mymoc1.hpp:the-header-needing-moc.hpp
moc$<-o$@
mymoc2.hpp:other-header-needing-moc.hpp
moc$<-o$@
我将学习下一个教程: 假设我成功地完成了前四个步骤,我的怀疑来自于在5c和5d步骤之间的选择。在我的情况下,我应该使用什么以及如何使用?像QtSql这样的依赖项会发生什么情况?还有moc

此外,我是否应该像教程所说的那样定义LD、AR或PKG_配置变量?我没有在原始makefile中指定链接器或汇编程序。万一我应该,为什么


EDIT我读到
mingw
在使用模板时遇到问题,我在项目中深入使用了这些模板。既然MXE在内部使用了<代码>明文> /代码>,我是否应该考虑其他替代方案(比如直接在Windows中构建)而不是使用MXE?

< P>我将在这里发布我自己的答案,但是充满了细节,因为我非常迷茫,也许其他用户也处于类似的状态。 我将学习下一个教程:假设我成功地完成了前四个步骤,我的疑问来自于在5c和5d步骤之间进行选择。在我的情况下,我应该使用什么以及如何使用

是的,您(实际上是我,我在回答我自己的问题)可以使用Makefile交叉编译静态链接的Qt项目。问题是,由于Qt是静态链接的,所以任何其他Qt依赖项也必须是静态链接的,这将创建一个潜在的库依赖项长字符串,添加到Makefile中(并且您还需要知道要传递给链接器的正确选项)。问题是这些选项或库中的一些与windows相关,因此,如果您以前从未为windows编译过程序,您很难知道它们是什么以及它们的用途

因此,您最好编写自己的
.pro
文件,用
qmake
创建一个工作Makefile。此时,如果您仍然希望生成自定义Makefile,则可以执行由
qmake
生成的
Makefile
,并查看执行的命令,以便在自定义Makefile中进行复制和实验

无论如何,我将发布我所到达的最远的
makefile
(在本文后面,我将展示我的
*.pro
文件的样子)。它编译成功,但在链接时崩溃,因为有许多未解决的依赖项,我无法如上所述修复(我的mxe安装在`/usr/local/mxe中):

但是我不认为MXE的
moc
和你的有什么重要区别,除了MXE版本可能更现代(我不知道)

此外,我是否应该像教程所说的那样定义LD、AR或PKG_配置变量

没有必要。如果不显式使用它们,则不需要定义它们

我读到mingw在使用模板方面有困难,我在我的项目中深入使用了它们

错。当前的MXE版本安装了
gcc
5.1.0的
mingw32
forge,它的工作方式很有魅力

那么
.pro
文件呢

MXE = /usr/local/mxe/usr/$$CROSS
MXE_INCL = $$MXE/include
MXE_LIB = $$MXE/lib
MXE_QT = $$MXE/qt

MXE_QTINCL = $$MXE_QT/include
MXE_QTLIB = $$MXE_QT/lib

TARGET = myapp # .exe no required.

OBJS = main.o
MOC_HEADERS = mymoc1.hpp mymoc2.hpp
HEADERS = $$MOC_HEADERS other-headers
SOURCES = main.cpp

QMAKE_CXX = $${CROSS}-g++
QMAKE_CXXFLAGS = -static -std=c++11 -pedantic -pedantinc-errors -Wall

QMAKE_LFLAGS += -Xlinker -Bstatic
INCLUDE_PATH += $$MXE_QTINCL $$MXE_QTINCL/QtGui $$MXE_QTINCL/QtSql

TEMPLATE = app
CONFIG += qt release
QT += core gui sql

LIBS += -L$$MXE_QTLIB -L$$MXE_LIB

# Call it (for x86_64):
#    /usr/local/mxe/usr/x86_64-w64-mingw32.static/qt/bin/qmake\
#      -makefile -o cross_makefile -nomoc CROSS=x86_64 myapp.pro
#    make -f cross_makefile

如您所见,我是说
qmake
不生成
moc
文件(选项
-nomoc
),因为出于某种奇怪的原因,
qmake
无法在这么多模板中找到我的
Q_对象。所以,我以前必须手动生成它们。我真正做的是修改我原来的makefile(我用来编译Linux项目的makefile)通过目标调用
cross
,生成
moc
文件,然后使用适当的选项自动调用
qmake

如果mingw使用您的代码,您可以通过直接在Windows下使用mingw构建项目来找到答案。在交叉编译之前,我首先要确保它在Windows上构建并运行。
ifndef CROSS
CROSS=x86_64
endif

CROSS_ID=$(CROSS)-w64-mingw32.static
MXE_BASE=/usr/local/mxe/usr
MXE_USR=$(MXE_BASE)/$(CROSS_ID)

MXE_INCL=$(MXE_USR)/include
MXE_QTINCL=$(MXE_USR)/qt/include
MXE_LIB=$(MXE_USR)/lib
MXE_QTLIB=$(MXE_USR)/qt/lib

LDIFLAGS=-I$(MXE_INCL) -I$(MXE_QTINCL)/QtCore -I$(MXE_QTINCL)/QtGui -I$(MXE_QTINCL)/QtSql
LDLFLAGS=-L$(MXE_LIB) -L$(MXE_QTLIB)

LDLIBS=-Wl,-Bstatic -lwinmm -loleut32 -lQtGui -lQtSql -lQtCore

CXX=$(MXE_PATH)/bin/$(CROSS_ID)-g++
CXXFLAGS=-std=c++11 -pedantic -pedantic-errors -Wall

OBJS=main.o
MOC_HEADERS=mymoc1.hpp mymoc2.hpp
HEADERS=$(MOC_HEADERS) myheaders

APP=myapp.exe

all: $(APP)

$(APP): $(OBJS)
     $(CXX) $(CXXFLAGS) $(OBJS) -o $@ $(LDLFLAGS) $(LDLIBS)

main.o: main.cpp $(HEADERS)
     $(CXX) $(CXXFLAGS) $< -o $@ $(LDIFLAGS)

mymoc1: header1.hpp
     moc $< -o $@

mymoc2: header2.hpp
     moc $< -o $@

# Thee ways of call it:
#   make  # CROSS=x86_64 by default as shown in the first line.
#   make CROSS=x86_64 # Make it explicit.
#   make CROSS=i686 # Choose 32 bit.
MXE_MOC=$(MXE_USR)/qt/bin/moc

mymoc1: header1.hpp
    $(MXE_MOC) $< -o $@
MXE = /usr/local/mxe/usr/$$CROSS
MXE_INCL = $$MXE/include
MXE_LIB = $$MXE/lib
MXE_QT = $$MXE/qt

MXE_QTINCL = $$MXE_QT/include
MXE_QTLIB = $$MXE_QT/lib

TARGET = myapp # .exe no required.

OBJS = main.o
MOC_HEADERS = mymoc1.hpp mymoc2.hpp
HEADERS = $$MOC_HEADERS other-headers
SOURCES = main.cpp

QMAKE_CXX = $${CROSS}-g++
QMAKE_CXXFLAGS = -static -std=c++11 -pedantic -pedantinc-errors -Wall

QMAKE_LFLAGS += -Xlinker -Bstatic
INCLUDE_PATH += $$MXE_QTINCL $$MXE_QTINCL/QtGui $$MXE_QTINCL/QtSql

TEMPLATE = app
CONFIG += qt release
QT += core gui sql

LIBS += -L$$MXE_QTLIB -L$$MXE_LIB

# Call it (for x86_64):
#    /usr/local/mxe/usr/x86_64-w64-mingw32.static/qt/bin/qmake\
#      -makefile -o cross_makefile -nomoc CROSS=x86_64 myapp.pro
#    make -f cross_makefile