问题标签 [mxe]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1601 浏览

c++ - 在从 Linux 构建 Windows 应用程序时,如何使用 CMake 获取依赖项?

目前我正在尝试使用 Linux 中的 MinGW 和 CMake 为 Windows 部署 Qt 应用程序。我使用 MXE 准备构建环境(安装 mingw32 并编译 Qt5 共享库)。我已经编写了 CMakeList.txt 和一个工具链脚本,他们可以构建我的应用程序。

我无法实现的是将共享的 Qt dll 传递给我构建的可执行文件。

这是我的工具链文件: http: //pastebin.com/gh7kSda4

这是我的 CMakeLists.txt: http://pastebin.com/wHA7f7Sj

这是该脚本的摘录,其中包含安装部分:

如您所见,我使用 fixup_bundle 来实现我的目标。

输入后,make install我得到以下输出: http: //pastebin.com/DymaH1Mu

x86_64-w64-mingw32-Bundle之后,文件夹中除了 mEyeSaver.exe 之外什么都没有。没有 dll 被复制。我确定~/mxe/usr/x86_64-w64-mingw32.shared/qt5/bin文件夹中需要 Qt dll。但是我仍然做错了一些事情。

如何解决问题?谢谢

更新

我重新考虑了我正在做的事情,发现可能 fixup_bundle 无法分析 Windows 可执行文件的依赖关系,因为 Linux ldd(它使用的)与 Windows 应用程序无关。所以我编辑了我的问题。

是否有任何简单的方法可以使用 CMake(或其他工具)为 Windows 可执行文件获取依赖库,而无需直接复制它们?

0 投票
0 回答
310 浏览

qt - 为 Windows 构建 SIP 和 PyGlobalShortcut

我正在 Ubuntu 下编写 Python2.7/PyQt4 程序,但应用程序将部署在 Windows 平台上。其中一个功能是应用程序应该捕获几个击键(例如“Alt+A”),即使它没有处于焦点/最小化状态。为此,我使用PyGlobalShortcut ,它是一个 Python/SIP 包装器libxqt。按照手册,我安装了 Qt4 + SIP并运行pip install PyGlobalShortcut命令,它自动编译并安装了 libqxt 库和 Python 包装器。这完美无缺。

在 Windows 下原生构建

但是,我试图在 Windows 下安装 PyGlobalShortcut 时碰壁了。该软件包的二进制分发版已过时,这意味着我必须自己编译它。我必须安装 Qt4 + MinGW 并进行调整$PATH,这不是问题。下一步是获取 SIP,不幸的是,它没有以 Py2.7 的二进制形式提供。我得到了 SIP 的源代码,但无法构建它:

make立即返回找不到错误mingw32-make的调用。我用谷歌搜索了一下,它似乎是 MS Visual Studio 的一个组件或类似的东西,但它与 MinGW 有什么关系?我找不到任何提供此 dll 或解释如何获取它的官方网站。MSVCR80.dll

Linux下的交叉编译

我还认为我可以使用MXE在 Linux 机器上交叉编译 PyGlobalShortcut 。我也没有做到这一点。我用这个 SO 答案作为指导。我有 MXE,交叉编译的 Qt4 并检查wine它是否有效。然后我包含<mxe>/usr/bin并尝试交叉编译 Windows 的 SIP <mxe>/usr/i686-w64-mingw32.static/qt/bin$PATH它惨遭失败,因为 Makefile 调用本机 linuxg++而不是 c++ 编译器MXE

所以我将编译器和链接器符号链接到<mxe>/usr/bin,即i686-w64-mingw32.static-g++g++等。这有帮助,但现在g++需要 Python 库和头文件。它在下面查找它们/usr/include/python2.7- 但它们是为 linux 编译的,因此不能链接到 windows 二进制文件。

看来我需要一个 Windows 版本的 Python 来编译这些东西,放在 下<mxe root>,但是...... 来吧,现在它变得太复杂了。我很确定我在这里遗漏了一些简单的东西。不幸的是,我在为 Windows 编译方面没有太多经验,希望能得到任何帮助。

快捷方式的其他选项?

我不介意重写我的 Python 程序并使用任何其他跨平台库来捕获全局快捷方式,但除了 PyGlobalShortcut 之外我没有找到任何其他的。

0 投票
1 回答
413 浏览

ffmpeg - 使用 MXE 交叉编译 FFmpeg + Qt 应用程序

我有一个非常简单的项目,它使用 Qt 以及我在 linux 下开发的 FFmpeg。
现在我在使用 MXE 交叉编译所述项目以在 Windows 机器上使用它时遇到了麻烦。

在linux下我要做的就是添加

到 Qt 的 .pro 文件并将 FFmpeg 的包含文件包装在“extern“C””块中,它编译得很好。

现在对于 MXE,我只是克隆了 git repo 并使用了

正如 MXE 文档所述,我设置了 PATH 变量并使用了

但是我得到了很多关于 libavformat 的未定义参考错误。

谁能告诉我我在这里做错了什么?我有点迷路了。

0 投票
1 回答
430 浏览

c++ - 交叉编译链接器错误

我正在为 Linux 上的 Windows 交叉编译一个小的 c++ 脚本。

它是用 Qt 制作的并使用 curl,我通过 mxe (make qt5make curl) 编译了 qt 和 curl。

然后我运行这些命令:

  1. $MXE/usr/i686-w64-mingw32.static/qt5/bin/qmake
  2. make

这给了我这些错误:

当我为 Linux 编译它时,没有错误。

这是我的 .pro 文件:

任何帮助表示赞赏。

如果您需要任何其他信息,请随时询问。

编辑:

的输出make VERBOSE=1

0 投票
0 回答
102 浏览

c++ - 使用 --enable-64 编译 Octave MXE nsi-installer

我正在尝试使用 --enable-64 为 Windows 编译 Octave nsi-installer 以支持大型阵列。

尝试 1:在 Windows 10 上使用 Linux Mint 虚拟机:

./configure 显示一切似乎都正常,运行 make 后,完成了很多工作。但是,进入“[build] default-octave”几分钟后,它就崩溃了。查看日志,当尝试链接 liboctave/.libs/liboctave-3.dll 时,它说:

libgnu/.libs/libgnu.a(lock.o):在函数glthread_recursive_lock_init_multithreaded': /home/mike/temp/mxe-octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/libgnu/glthread/lock.c:289: undefined reference to__imp_pthread_mutexattr_init'/home/mike/temp/mxe-octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/libgnu/glthread/lock。 c:292: 未定义引用__imp_pthread_mutexattr_settype' /home/mike/temp/mxe-octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/libgnu/glthread/lock.c:298: undefined reference to__imp_pthread_mutex_init' /home/mike/temp/mxe-octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/libgnu/glthread/lock.c:304: 未定义引用__imp_pthread_mutexattr_destroy' /home/mike/temp/mxe-octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/libgnu/glthread/lock.c:301: undefined reference to__imp_pthread_mutexattr_destroy' /home/mike/temp/mxe-octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/libgnu/glthread/lock.c:295:未定义对__imp_pthread_mutexattr_destroy' libgnu/.libs/libgnu.a(strsignal.o): In functioninit'的引用:/home/mike/temp/mxe -octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/libgnu/strsignal.c:143:未定义对__imp_pthread_key_create' libgnu/.libs/libgnu.a(strsignal.o): In functionfree_key_mem'的引用:/home/mike/temp/mxe-octave-3fc30cd416ac/tmp-default-octave /octave-4.1.0+/libgnu/strsignal.c:170:未定义的引用__imp_pthread_setspecific' libgnu/.libs/libgnu.a(strsignal.o): In functionstrsignal':/home/mike/temp/mxe-octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/libgnu/strsignal.c:101:未定义对__imp_pthread_once' libgnu/.libs/libgnu.a(strsignal.o): In functiongetbuffer的引用':/home/mike/temp/ mxe-octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/libgnu/strsignal.c:186:未定义对__imp_pthread_getspecific' /home/mike/temp/mxe-octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/libgnu/strsignal.c:195: undefined reference to__imp_pthread_setspecific'collect2 的引用:错误:ld 返回 1 个退出状态

所以,问题在于 lock.c 中所有这些对 '__imp_pthread_' 函数的未定义引用。

当我在这些行中查看 lock.c 时,代码显示:

所以我的主要问题是,为什么在链接中将“__imp_”添加到函数的前面?

如果我'nm libpthread.so',我会看到类似的东西:

pthread_mutexattr_init.o: 0000000000000000 T __pthread_mutexattr_init 0000000000000000 T pthread_mutexattr_init

所以功能在那里,但链接看不到它们,因为附加了'__imp_'?我不明白...

日志显示使用了“-pthread”而不是“-lpthread”,我认为这是推荐的。当我查看日志顶部时,它显示:

检查 pthreads 库 -lpthreads... 否

检查 pthreads 是否在没有任何标志的情况下工作...否

检查 pthreads 是否与 -Kthread 一起工作...否

检查 pthreads 是否与 -kthread 一起工作...否

检查 pthreads 库 -llthread... 否

检查 pthreads 是否与 -pthread 一起工作...是

检查可连接的 pthread 属性... PTHREAD_CREATE_JOINABLE

检查 pthread 是否需要更多特殊标志...否

尝试2:使用CentOS linux系统:

与上面类似, ./configure 可以工作,但在“[build] default-octave”中有一点方法,它会崩溃。查看日志,它说:

所以,'{r, c, lengths...}' 行的解释方式似乎存在一些问题......我第一次尝试使用 GCC 4.4.7,但是一旦升级到 GCC 6.2.0,同样的事情发生了.

有什么想法吗?

0 投票
1 回答
1095 浏览

c++ - 从linux交叉编译时如何链接到第三方dll?

我想使用这些mingw-w64工具从 Linux 交叉编译 Windows 64 位的 C++ 项目(实际上我使用的是基于 mingw-w64 的M Cross Environment ,但我认为这与问题无关)。在我的情况下,最后一步需要链接到几个第三方编译的 dll。我没有这些dll的源代码,只有头文件和编译好的二进制文件 用什么编译?我不知道,但可能是 Visual Studio。

为了准确解释我在做什么,我想从 Linux 交叉编译 Matlab mex 文件,并且需要链接到 Matlab 库 libmex.dll、libmx.dll 和 libmat.dll。但是,我认为回答这个问题不需要任何 Matlab 知识。

我模糊地意识到我需要从 dll 中提取定义,放入 .def 文件中,并且也许我需要创建另一个链接库来实际链接到。

我已经尝试了这两个步骤,首先为每个库创建定义文件,我使用以下命令执行此操作:

这是生成的定义文件的片段libmx.def

然后,我尝试根据此处为 Mingw 提供的说明创建一个导入库。但是,当我使用 mingw-w64 时,我的命令实际上是

但是,当我尝试构建一个链接到这些库的简单示例时,出现错误。这是用于构建和链接库的实际命令。

编译步骤正常,但链接步骤失败并出现以下错误:

我很高兴这个编译的结果是静态链接的。

所以我的问题是,在从 Linux 交叉编译 Windows 时,我究竟需要做什么才能链接到第三方 dll,为什么在这种情况下链接步骤会失败?

顺便说一句,这个特定示例是一个简单的 C 文件示例,实际上我还想链接 C++ 文件。随意指出我的过程中与 C 和 C++ 构建过程混淆有关的任何明显缺陷!

0 投票
1 回答
1671 浏览

c++ - 使用 mingw-w64 时未找到或正确包含 float.h

我正在尝试交叉编译一段代码,它使用 float.h 来设置一些 FPU 大小。

需要它的特定代码是:

但是,当我编译时,我得到了错误

另一个人在这里更详细地解释了似乎是相同的问题。在此处的(相当旧的)线程中也描述了一个非常相似的问题 。如果它是相关的,我正在使用mingw-w64,但通过M Cross Environment

在这种情况下到底有什么问题float.h,是否有解决方法?

编辑:来自 gcc 的详细输出

编辑:更多信息

如果我使用类似的完整目录路径,我也会得到相同的结果mingw-w64 float.h

编辑有关代码结构的更多信息

为了提供更多信息,我实际上正在编译 C 库(头文件和 C 文件),其中包含我正在使用的函数的声明extern C。头文件中的实际声明如下所示:

我使用的实际库是Triangle。float.h 包含在 triangle.c 中,如下所示:

您在哪里定义CPU86LINUX在编译时。对于交叉构建,我正在定义CPU86.

0 投票
0 回答
588 浏览

c++ - 查找库依赖项(make/cmake/linker)

我正在尝试使用MXE和 cmake构建一个跨平台的 QT C++ 应用程序(Linux/Windows) 。我非常非常努力地用谷歌搜索,你不知道我的谷歌查询有多棒。此类查询。但:

问题:未定义的引用。

(以及许多其他此类)

解决方案:

然后添加到 CMakeFiles.txt:

最后一个问题:其他未定义的引用。

但我不知道这个compresshb_font_funcs_set_glyph_v_origin_func来自哪个图书馆。我可以一个一个地用谷歌搜索它们,但它看起来像是石器时代的做法。从长远来看,我不想对每个交叉编译的项目都这样做。

问题:

如何在不阅读 qt 构建文件的情况下找到所需库的名称?有没有办法使用 cmake 或 make 输出依赖项(需要动态库)?

可能的解决方案:

  • 我知道我可以在二进制文件上使用ldd 。我需要的是链接时间ldd之类的东西。这可能吗?

  • 也许我可以使用 make(在 QT 构建阶段)来打印 QT 的依赖项。如果是这样,该怎么做?

UPD:发现

  • mxe 相关的几乎解决方案:

    usr/bin/i686-w64-mingw32.static-pkg-config --list-all | sort

    usr/bin/i686-w64-mingw32.static-pkg-config Qt5Widgets --libs

0 投票
0 回答
688 浏览

c++ - Linux 上的 QT 编译:使用 mxe / mingw / Linux、Debian 进行交叉编译失败

我无法编译 Windows 钱包,它每次都会显示这个错误:我在这里错过了什么?我正在使用 Debian。

源代码:https ://github.com/rat4/blackcoin

compile-gtc.sh 的内容:

几分钟后,我开始了 ./compile-gtc.sh 我得到了这个错误:

/mnt/mxe/usr/i686-w64-mingw32.static/lib/libdb_cxx.a(os_pid.o):os_pid.c:(.text+0x25): undefined reference to `pthread_self' collect2: error: ld returned 1退出状态 Makefile.Release:427: 目标“release/blackcoin-qt.exe”的配方失败 make: *** [release/blackcoin-qt.exe] 错误 1

谢谢,

0 投票
1 回答
525 浏览

qt - 如何在 mxe 中指定特定的 qt 版本

我需要将 qt 5.5 版与 mxe 一起使用,但找不到任何选项。我只看到 4.8.7 的 qt 和 5.8 的 qt5 我是否仅限于两个版本之一,或者是否有任何选项也可以使用 5.5。

谢谢