Как кросс-компилировать приложения на Ubuntu для Windows - PullRequest
0 голосов
/ 10 апреля 2019

Я разрабатывал приложение, построенное на Qt 5 в Ubuntu, в Qt Creator. Используемый формат проекта - CMake. Пришло время кросс-компилировать материал в двоичный файл, который может быть запущен в Windows. Итак, у меня есть

  1. установлен Clang и Mingw-W64
  2. создал файл цепочки инструментов CMake, указывающий на нужные инструменты (те, что из установленной цепочки инструментов MiGW) и установил целевую тройку равной x86_64-w64-mingw32 (эта тройка используется, потому что она соответствует пути, где установлена ​​цепочка инструментов gcc).
  3. скачал пакеты, начиная с mingw64-qt с https://dl.fedoraproject.org/pub/fedora/linux/development/30/Everything/x86_64/os/Packages/m/, распаковал их, объединил распакованные каталоги, удалил все ненужное, исправил сценарии CMake, чтобы они соответствовали путям в системе (есть жестко закодированные пути в сценариях).
  4. добавил пути к нужным каталогам распакованного Qt в файл цепочки инструментов, чтобы автообнаружение работало
  5. Пытался построить.

Когда я пытался собрать, некоторые файлы (6) моего проекта скомпилировались нормально, но 4 вызвали неприятные ошибки компиляции:

/usr/share/mingw-w64/include/rpcndr.h:64:11: error: reference to ‘byte’ is ambiguous
/usr/share/mingw-w64/include/objidlbase.h:2067:5: error: ‘byte’ has not been declared

ОК, подумал я, может MinGW-w64 в репозиториях Ubuntu гнилой? На самом деле это 6.0 в репозиториях Ubuntu, но на MinGW-w64 доступен сайт 8.1.

OK. Я удалил пакет, скачал https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/8.1.0/threads-posix/seh/x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z , распаковал его, настроил файл набора инструментов для использования clang и clang ++ в качестве компиляторов и llvm binutils, установил sysroot, указывающий на распакованный dir, попытался восстановить ... и получил те же ошибки (но в новом sysroot).

Что ж, я пытался создать что-то более простое с точки зрения зависимостей и того, что известно для сборки g ++ - ниндзя.

Тот же результат. Я попытался тогда MinGW-w64 toolchain (версия для Windows) работать в Wine. Тот же результат. Черт.

Простое приложение hello world собирается и работает отлично во всех случаях.

Как создать кросс-приложение, более сложное, чем hello world для Windows, с помощью MinGW-w64 stdlib?

Также мне интересно, как настроить Qt Creator для правильного использования этого набора инструментов.

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

Я использую https://mxe.cc для кросс-компиляции моих приложений Qt в Windows. Вы можете настроить его в своем домашнем каталоге. После того, как вы скажете ему выбрать и скомпилировать нужные вам зависимости (например, qtbase, cmake и т. Д.), Вы можете скомпилировать ваше приложение с помощью:

i686-w64-mingw32.static-cmake path_to_your_project
make

Для проекта qmake вы должны использовать i686-w64-mingw32.static-qmake.

0 голосов
/ 10 апреля 2019

Это была ошибка в заголовочных файлах stdlib, поставляемых с цепочками инструментов. Это был конфликт между заголовками C и C ++. Я до сих пор не представляю, почему эта ошибка не срабатывает, когда инструментальная цепочка вызывается в Windows, но я решил эту проблему, введя макроопределение, защищающее определения проблемных типов. Грязный хак это: лучшее решение состоит в том, чтобы переместить их в собственный заголовок, защитить его с помощью #pragma once и включить его там, где это необходимо.

From: KOLANICH
Date: Thu, 11 Apr 2019 20:06:23 +0300
Subject: Fixed the bug with conflict between C and C++ definitions of byte.

---
 lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/functional | 3 ++-
 x86_64-w64-mingw32/include/rpcndr.h                     | 6 ++++++
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/functional b/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/functional
index 2b46ba8..6b4e027 100644
--- a/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/functional
+++ b/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/functional
@@ -893,7 +893,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 #if __cplusplus >= 201703L
   // Declare std::byte (full definition is in <cstddef>).
   enum class byte : unsigned char;
-
+  #define _BYTE_DEFINED_AdTydTeKkpRvvDuzZisXJMGxPRSHkr
+  
   template<>
     struct __is_byte_like<byte, equal_to<byte>>
     : true_type { };
diff --git a/x86_64-w64-mingw32/include/rpcndr.h b/x86_64-w64-mingw32/include/rpcndr.h
index 52de4ad..a490aa4 100644
--- a/x86_64-w64-mingw32/include/rpcndr.h
+++ b/x86_64-w64-mingw32/include/rpcndr.h
@@ -60,7 +60,13 @@ extern "C" {
 #ifdef RC_INVOKED
 #define small char
 #endif
+
+#ifndef _BYTE_DEFINED_AdTydTeKkpRvvDuzZisXJMGxPRSHkr
   typedef unsigned char byte;
+  #define _BYTE_DEFINED_AdTydTeKkpRvvDuzZisXJMGxPRSHkr
+#else:
+  typedef std::byte byte;
+#endif
   typedef byte cs_byte;
   typedef unsigned char boolean;

-- 
2.20.1


...