- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个项目使用 Qt4,没有额外的库和 QtSql(用于使用 SQLLite 数据库),我想为 x86_64 Windows 7 机器交叉编译它。这是我总结的 makefile(它只使用 .hpp 文件,除了 main.cpp,因为我使用了很多模板):
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 other-headers
all: myexec
myexec: $(OBJS)
$(CXX) $(CXXFLAGS) $(OBJS) -o $@ $(LDFLAGS)
main.o: main.cpp $(HEADERS)
$(CXX) -c $(CXXFLAGS) $< -o $@ $(IPATH)
mymoc1.hpp: the-header-needing-moc.hpp
moc $< -o $@
mymoc2.hpp: other-header-needing-moc.hpp
moc $< -o $@
我将学习下一个教程:http://mxe.cc/#tutorial假设我已经成功完成了前四个步骤,我的疑问来自于在 5c 和 5d 步骤之间进行选择。在我的情况下我应该使用什么以及如何使用?像 QtSql 这样的依赖会发生什么?还有 moc?
此外,我是否应该按照教程中的说明定义 LD、AR 或 PKG_CONFIG 变量?我没有在原始 makefile 中指定链接器或汇编器。如果我应该这样做,为什么?
编辑 我读过here mingw
在使用模板时遇到了麻烦,我在我的项目中深入使用了它们。由于 MXE 在内部使用 mingw
,我是否应该考虑其他替代方案(例如直接在 Windows 中构建)而不是使用 MXE?
最佳答案
我将在这里发布我自己的答案,但充满了细节,因为我很迷茫,也许其他用户也处于类似情况。
I am going to follow the next tutorial: http://mxe.cc/#tutorial Supposing I've complete successfully the first fourth steps, my doubt comes from choosing between 5c and 5d steps. What shall I use and how in my case?
是的,您(我确实是在回答我自己的问题)可以使用 Makefile 交叉编译静态链接的 Qt 项目。问题是,由于 Qt 是静态链接的,任何其他 Qt 依赖项也必须是静态链接的,这会创建一个潜在的长字符串库依赖项以添加到您的 Makefile 中(并且您还需要知道要传递的正确选项到链接器)。问题是这些选项或库中的一些不是特定于 Windows 的,因此,如果您以前从未为 Windows 编译过程序,则很难知道它们是什么以及它们的用途。
出于这个原因,您可以做的最好的事情就是编写您自己的 .pro
文件,以使用 qmake
创建一个有效的 Makefile。在这一点上,如果你仍然想制作你的自定义 Makefile,你可以执行 qmake
生成的 makefile
并查看执行的命令,复制回去并在你的中进行实验自定义生成文件。
无论如何,我将发布我到达的最远的 makefile
(在这篇文章的后面我将展示我的工作 *.pro
文件的样子)。它编译成功,但是在链接时崩溃了,因为有很多 Unresolved 依赖关系我无法按照上面的方法修复(我的 mxe 安装在 `/usr/local/mxe 中):
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.
What does it happen with dependencies like QtSql?
如您所见,您将依赖项视为其他普通库:使用 -l
选项指定它,但现在使用 Wl,-Bstatic
(也就是说链接器链接必须是静态的),并使用 -L
选项指定交叉编译库的确切位置,如上面的代码所示。此外,在该 makefile
中,我添加了 -lwinmm
和 -loleut32
,因为它们属于下降依赖项。
无论如何,由于链接器的原因,这个 makefile 不能完全编译,但是要工作,你应该只添加其他间接需要的库和选项(参见 qmake
生成的 makefile
)。无论如何,主要的配置
问题都显示在上面的makefile
中。
And with moc?
moc
工具是一个预处理器,因此与机器无关 (AFAIK)。因此,您可以使用本地安装的 moc 将 moc
传递给您的文件。不管怎样,MXE 当然也安装了一个特定于平台的 moc
:
MXE_MOC=$(MXE_USR)/qt/bin/moc
mymoc1: header1.hpp
$(MXE_MOC) $< -o $@
但我认为 MXE 的 moc
和你的之间没有重要区别,除了 MXE 版本可能更现代(我不知道)。
Additionally, should I define LD, AR or PKG_CONFIG variables as the tutorial says?
没必要。如果您没有明确使用它们,则不需要定义它们。
I've read that mingw has troubles working with templates, and I make a deep use of them in my project.
错了。当前的 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_OBJECT
。所以,我之前必须手动生成它们。我真正做的是用生成 moc
文件然后自动调用的目标调用 cross
修改我的原始 makefile(我用来为 Linux 编译项目的那个) qmake
加上适当的选项。
关于c++ - 使用自定义 Makefile 而不是 qmake 交叉编译 Ubuntu-Win7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30386597/
我想使用单个(交叉)编译器来编译不同 ARM 调用约定的代码:因为我总是想使用浮点和 NEON 指令,所以我只想选择硬浮点调用约定或软浮点(softfp)调用约定。 我的编译器默认为硬浮点,但它支持我
假设我正在构建一个依赖于两个库的 java 应用程序:A 和 B。A 和 B 都依赖于库 C。管理 A 和 B 使用相同版本的最佳方法是什么所以他们不冲突?我正在使用 Gradle。 最佳答案 从 G
我想在按钮的文本上添加图像。如果我将图像添加为按钮的背景,它就会添加到文本下方。预期结果作为图像添加。请帮忙 更新:我需要以编程方式执行此操作。 最佳答案 在 XML 中, * 在代码中
我已经开始使用 CSS3 制作动画了。 我尝试创建一个动画汉堡菜单,但结果有点难看。顶部和底部的条向右平移一点。所以旋转动画不是很流畅和正确。 这是结果 => 这是我的代码: /* HTML */
给定一个具有2条相交曲线的图像,如下图所示,我如何使用opencv或python检测和区分2条曲线? (所以我需要2条单独的曲线) 最佳答案 您可以扫描每一列,并从连接的零件中识别出簇。 伪算法: l
我正在尝试在 redhat 集群(x86_64 主机)上设置 cross-mingw。我没有 root 访问权限,并且可用的 mingw 二进制文件不起作用(坏 glibc 版本等)。我正在阅读本教程
我正在尝试在javaFX中开发一个游戏,当两个图像相交时,分数将被更新,并且障碍物将不可见。但不幸的是,在游戏中分数不断更新。 我想我无法在游戏中正确地使图像不可见。 以下是相关类的完整代码: pac
pikastar dot com 是网站,当向下滚动它然后在导航菜单展开固定位置时它 > 将穿过主 div。我该如何修复它。 #topNav.sticky { box-shadow: 0 10
我正在使用 Eclipse为 ARM 处理器交叉编译 g++ 项目。我在 Windows 环境中使用 yagarto 工具链。我对 C 项目没有问题,但是对于 C++,我一直收到错误: libc.a(
我想从两个哈希数组中获取并集/交集/差集,例如: array1 = [{:name =>'Guy1', :age => 45},{:name =>'Guy2', :age => 45}] array2
有没有办法在调用任何 Controller 操作之前执行一些代码? 我需要根据 get 参数的值设置 session 变量,而不考虑调用哪个 Controller 。 当然,一旦这个处理完成,请求需要
我刚开始使用 3D 网格,面向用于有限元分析。我想在立方体状矩阵中模拟 Material 的夹杂物(任何形状,但主要对球体和椭圆体感兴趣)。这些夹杂物不应彼此重合。 所以我想为python使用某种包,
我想知道以跨平台方式操作应用程序设置的最佳解决方案是什么。 在 iOS 中,我们可以在设置屏幕中更改应用程序外部的设置,但在 windows phone 和 android 中我们没有。 所以,我的想
var barcodeNum = ko.observable(""); VelocityMeetings.scan = function (params) { var errorMessage = k
这个问题在这里已经有了答案: Transforming data.frame in R (2 个答案) 关闭10 年前。 过去我问过一个关于如何create cross tables from a
我有两个共享同一个工厂的 Controller 。其中一个 Controller 正在更新工厂变量。其他人应该注意该变化并稍后显示。 我是这样尝试的: http://plnkr.co/edit/q1N
标题不好,但这是我发现的将我的问题与简单的表格交叉区分开来的方式,因为我之前的研究总是让我接触到这类主题。 我有几个表 - 为了简化起见,我们只用 3 个表来命名它们:A、B、C。我想将它们全部放在一
我需要做这样的事情(在 MySQL 中),我使用 UNION 的尝试直到现在才奏效。 理论上: SELECT * FROM tableA A JOIN tableB B ON A.tableAId =
注意:使用SDL 2.0,Cross header class问题 我在类之间进行交叉引用,主要是我的类初始化渲染器和我的纹理类引用渲染初始化。现在,我已经能够运行该程序,直到我开始放入纹理类,代码也
我有一个这样的字母数组 var letters = ["Y", "X", "A", "Y", "O", "H", "A", "O", "O"]; 我创建了一个循环来
我是一名优秀的程序员,十分优秀!