使用动态链接在Linux上交叉编译Windows的Qt应用程序

时间:2013-01-28 21:37:36

标签: qt dynamic-linking qt5 cross-compiling mxe

为了遵守Qt的LGPL许可证,使用Qt库的应用程序必须使源代码可用或动态链接到Qt(如果我用这几个词正确地说明了这一点)。

所以我想创建一个完全正确的闭源应用程序。另外,我想在Linux(目前是Xubuntu 12.04)上使用支持C ++ 11的g ++ / MinGW来开发Windows二进制文件。我跟着this helpful guide来完成后者。但正如指南所述,创建了静态链接的可执行文件。

由于我使用MXE自动下载和构建Qt库(版本5.0),因此我没有太多机会影响该过程。所以我的问题是,如何创建动态链接版本的Qt库和各自的应用程序?

4 个答案:

答案 0 :(得分:9)

<强>更新

现在,使用MXE构建动态版本库的首选方法是为工具链指定“共享”选项:

make MXE_TARGETS=i686-w64-mingw32.shared qt5

<强>原始

编辑:我已经创建了一个git存储库,我已经完成了对MXE的所有必要更改以构建qtbase的共享版本。它可以在https://github.com/jeremysalwen/mxe获得。要构建,克隆存储库,然后运行'make qtbase'。我把原来的帖子留在了下面。

所以我下载了mxe环境,看起来使用的代码编译qt在src / qt.mk中有帮助

基本程序是将此代码与构建qt的标准方向相匹配。如果你查看qt.mk和qtbase.mk,你会发现它实际上非常简单,基本上只运行./configure,make,然后安装生成的文件。如果你能看到这个,你应该能够匹配静态/动态构建qt的方向,并修改qt.mk以便它与动态方向匹配。

无论如何,我想我已经找到了这个问题。编译qt时看起来差异是“-static”标志。因此,如果我们只是删除在qt.mk和qtbase.mk中传递给./configure的“-static”标志,我希望mxe会构建一个动态的qt版本。当然,您可能需要更改其他内容,但希望这就是您需要做的所有事情。

答案 1 :(得分:4)

首先,你需要设置葡萄酒。

sudo apt-get install wine

然后下载Qt5 Windows MinGW SDK Run with wine

wget http://releases.qt-project.org/qt5/5.0.1/qt-windows-opensource-5.0.1-mingw47_32-x86-offline.exe
wine qt-windows-opensource-5.0.1-mingw47_32-x86-offline.exe

按照向导安装Qt。 然后

cd ~/.wine/drive_c/Qt/Qt5.0.1/Tools/QtCreator/bin
wine qtcreator.exe

我尝试了qtcreator中的示例,它在linux下编译并运行良好,当我将exe文件复制到设置了Qt的Windows机器时,它也运行良好。

当然,一个缺点是你没有使用qtcreator和使用wine的编译器。我不知道它与原生linux二进制文件相比有多慢。但是jom是可用的,如果您的项目很大,可以使用多个内核进行编译。

要在qtcreator中使用jom而不是make,请在qtcreator中修改。

projects > Build & Run > Build > Build Steps > Make

用jom替换并添加make参数-j N,其中N是您要使用的核心数字。

答案 2 :(得分:2)

我最近一直在磕磕绊绊,并在octave's fork of mxe取得了一些成功。他经历了麻烦,用共享(.dll)库支持来构建qt,满足了我的需求。这是link to his post

答案 3 :(得分:0)

您需要为动态链接构建QT。如果您为静态链接(通常是Linux中的.a文件)构建了QT,那么您的二进制文件将是静态的。如果你在linux中构建共享对象文件(.so),你的二进制文件将动态链接。您还需要在应用程序中包含相关的.dll,以便当其他人运行可执行文件时,它可以访问这些库。

qt-project.org的QT SDK包含动态链接文件。