问题标签 [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.
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 可执行文件获取依赖库,而无需直接复制它们?
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 之外我没有找到任何其他的。
ffmpeg - 使用 MXE 交叉编译 FFmpeg + Qt 应用程序
我有一个非常简单的项目,它使用 Qt 以及我在 linux 下开发的 FFmpeg。
现在我在使用 MXE 交叉编译所述项目以在 Windows 机器上使用它时遇到了麻烦。
在linux下我要做的就是添加
到 Qt 的 .pro 文件并将 FFmpeg 的包含文件包装在“extern“C””块中,它编译得很好。
现在对于 MXE,我只是克隆了 git repo 并使用了
正如 MXE 文档所述,我设置了 PATH 变量并使用了
但是我得到了很多关于 libavformat 的未定义参考错误。
谁能告诉我我在这里做错了什么?我有点迷路了。
c++ - 交叉编译链接器错误
我正在为 Linux 上的 Windows 交叉编译一个小的 c++ 脚本。
它是用 Qt 制作的并使用 curl,我通过 mxe (make qt5
和make curl
) 编译了 qt 和 curl。
然后我运行这些命令:
$MXE/usr/i686-w64-mingw32.static/qt5/bin/qmake
make
这给了我这些错误:
当我为 Linux 编译它时,没有错误。
这是我的 .pro 文件:
任何帮助表示赞赏。
如果您需要任何其他信息,请随时询问。
编辑:
的输出make VERBOSE=1
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 function
init'的引用:/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 function
free_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 function
strsignal':/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 function
getbuffer的引用':/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,同样的事情发生了.
有什么想法吗?
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++ 构建过程混淆有关的任何明显缺陷!
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 中,如下所示:
您在哪里定义CPU86
或LINUX
在编译时。对于交叉构建,我正在定义CPU86
.
c++ - 查找库依赖项(make/cmake/linker)
我正在尝试使用MXE和 cmake构建一个跨平台的 QT C++ 应用程序(Linux/Windows) 。我非常非常努力地用谷歌搜索,你不知道我的谷歌查询有多棒。此类查询。但:
问题:未定义的引用。
(以及许多其他此类)
解决方案:
然后添加到 CMakeFiles.txt:
最后一个问题:其他未定义的引用。
但我不知道这个compress
或hb_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
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
谢谢,
qt - 如何在 mxe 中指定特定的 qt 版本
我需要将 qt 5.5 版与 mxe 一起使用,但找不到任何选项。我只看到 4.8.7 的 qt 和 5.8 的 qt5 我是否仅限于两个版本之一,或者是否有任何选项也可以使用 5.5。
谢谢