Windows — проблемы с компиляцией программ на C ++ с wineg ++ / winelib

У меня проблемы с компиляцией программ на C ++ с wineg++, Чтобы проиллюстрировать мою проблему, я написал две тестовые программы.

msgbox.cpp

#include <algorithm>
#include <iterator>
#include <cstdio>

#include <windows.h>

int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
char buf[30], *pos = buf;
int xs[] = {1,3,2,4,3,5,4,6,5,7,6,8,7,9};

std::sort( std::begin(xs), std::end(xs) );
for (int x : xs) {
pos += std::sprintf(pos, "%d ", x);
}

MessageBox(0, buf, "Hello", 0);
return 0;
}

frame.cpp

#include "../win32xx/include/wxx_wincore.h"#include "../win32xx/include/wxx_frame.h"
int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
CWinApp winApp;
CFrame frame;
CWnd view;
frame.SetView(view);
frame.Create();
winApp.Run();
}

Вторая программа использует Win32 ++ библиотека, которую я не могу рекомендовать достаточно.

Обе программы компилируются и работают нормально, используя кросс-компилятор:

okuu% x86_64-w64-mingw32-g++ msgbox.cpp -o msgbox.exe
okuu% wine ./msgbox.exe
okuu% x86_64-w64-mingw32-g++ frame.cpp -o frame.exe -lgdi32 -lcomctl32 -static
okuu% wine ./frame.exe
okuu% rm *exe*

Но я хочу использовать winelib так что я могу использовать библиотеки Windows API и Unix. Вот что я попробовал первым:

okuu% wineg++ msgbox.cpp -o msgbox.exe
okuu% ./msgbox.exe
okuu% wineg++ frame.cpp -o frame.exe -mwindows
In file included from ../win32xx/include/wxx_appcore.h:57:0,
from ../win32xx/include/wxx_wincore.h:96,
from frame.cpp:1:
../win32xx/include/wxx_appcore0.h:120:12: fatal error: process.h: No such file or directory
#include <process.h>
^~~~~~~~~~~
compilation terminated.
winegcc: g++ failed

Потом читаю wineg++Страница человека, которая говорит:

-MnO-Cygwin
Используйте реализацию MSVCRT для Wine вместо связывания с хост-системой libc. Это необходимо для подавляющего большинства приложений Win32, так как они обычно зависят от различных функций MSVCRT. Этот переключатель также используется компилятором MinGW для связи с MSVCRT в Windows, а не с Cygwin libc. Совместное использование синтаксиса с MinGW упрощает написание Make-файлов, которые работают под Wine, MinGW + MSYS или MinGW + Cygwin.

Поэтому я попробовал еще раз с -mno-cygwinи получил сообщение об ошибке в 2000 строк, которое начинается с:

okuu% wineg++ frame.cpp -o frame.exe -mwindows -mno-cygwin
In file included from /usr/include/c++/7.2.1/cstdlib:75:0,
from /usr/include/c++/7.2.1/bits/stl_algo.h:59,
from /usr/include/c++/7.2.1/algorithm:62,
from ../win32xx/include/wxx_appcore0.h:110,
from ../win32xx/include/wxx_appcore.h:57,
from ../win32xx/include/wxx_wincore.h:96,
from frame.cpp:1:
/usr/include/stdlib.h:310:5: error: ‘int32_t’ does not name a type; did you mean ‘wint_t’?
int32_t *fptr;  /* Front pointer.  */
^~~~~~~
wint_t
/usr/include/stdlib.h:311:5: error: ‘int32_t’ does not name a type; did you mean ‘wint_t’?
int32_t *rptr;  /* Rear pointer.  */
^~~~~~~
wint_t
/usr/include/stdlib.h:312:5: error: ‘int32_t’ does not name a type; did you mean ‘wint_t’?
int32_t *state;  /* Array of state values.  */
^~~~~~~
wint_t
/usr/include/stdlib.h:316:5: error: ‘int32_t’ does not name a type; did you mean ‘wint_t’?
int32_t *end_ptr;  /* Pointer behind state table.  */
^~~~~~~
wint_t
/usr/include/stdlib.h:320:8: error: ‘int32_t’ has not been declared
int32_t *__restrict __result) __THROW __nonnull ((1, 2));
^~~~~~~

Таким образом, кажется, что целочисленные типы C99 фиксированного размера недоступны. Это кажется достаточно простым для решения:

frame.cpp

#include <stdint.h>
#include "../win32xx/include/wxx_wincore.h"#include "../win32xx/include/wxx_frame.h"// etc. etc. etc.

И я попытался снова, но получил другое сообщение об ошибке в 2000 строк, которое начинается с:

okuu% wineg++ frame.cpp -o frame.exe -mwindows -mno-cygwin
In file included from /usr/include/c++/7.2.1/cwchar:44:0,
from /usr/include/c++/7.2.1/bits/postypes.h:40,
from /usr/include/c++/7.2.1/bits/char_traits.h:40,
from /usr/include/c++/7.2.1/string:40,
from ../win32xx/include/wxx_appcore0.h:111,
from ../win32xx/include/wxx_appcore.h:57,
from ../win32xx/include/wxx_wincore.h:96,
from frame.cpp:2:
/usr/local/include/wine/msvcrt/wchar.h:398:23: error: conflicting declaration of C function ‘size_t mbstowcs(wchar_t*, const char*, size_t)’
size_t        __cdecl mbstowcs(wchar_t*,const char*,size_t);
^~~~~~~~

На данный момент у меня закончились идеи. Это то, что я понял до сих пор:

  • Libc моей системы и MSVCRT Wine имеют противоречивые определения. (Это, вероятно, следовало ожидать.)
  • Libc ++ моей системы встроен для работы с libc моей системы.
  • Wine поставляется с MSVCRT, но не со стандартной реализацией библиотеки C ++.

Логичный курс действий с информацией, которую я имею до сих пор, должен был бы искать реализацию стандартной библиотеки C ++, которая совместима с MSVCRT Wine, но я не знаю ни одного. Кто-нибудь здесь знает об этом?

1

Решение

Единственное решение, которое я могу придумать, это придерживаться системы libc и написать свой собственный process.h, Этот файл должен либо #include стандартные заголовочные файлы, которые имеют функции, необходимые Win32 ++, или предоставляют собственные реализации этих функций. Если Win32 ++ не будет компилироваться без конкретной функции, но ваша программа на самом деле не зависит от этой функции, реализация этой функции может просто вернуть 0 или другое поддельное значение.

Если в системном libc есть файл заголовка, который запрашивает Win32 ++, но этот файл не объявляет все функции, ожидаемые Win32 ++, вам придется написать файл заголовка, такой как win32xx-compat.h который определяет эти функции и #include это перед любым заголовком Win32 ++.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]