У меня проблемы с компиляцией программ на C ++ с wineg++
, Чтобы проиллюстрировать мою проблему, я написал две тестовые программы.
#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;
}
#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 фиксированного размера недоступны. Это кажется достаточно простым для решения:
#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);
^~~~~~~~
На данный момент у меня закончились идеи. Это то, что я понял до сих пор:
Логичный курс действий с информацией, которую я имею до сих пор, должен был бы искать реализацию стандартной библиотеки C ++, которая совместима с MSVCRT Wine, но я не знаю ни одного. Кто-нибудь здесь знает об этом?
Единственное решение, которое я могу придумать, это придерживаться системы libc и написать свой собственный process.h
, Этот файл должен либо #include
стандартные заголовочные файлы, которые имеют функции, необходимые Win32 ++, или предоставляют собственные реализации этих функций. Если Win32 ++ не будет компилироваться без конкретной функции, но ваша программа на самом деле не зависит от этой функции, реализация этой функции может просто вернуть 0 или другое поддельное значение.
Если в системном libc есть файл заголовка, который запрашивает Win32 ++, но этот файл не объявляет все функции, ожидаемые Win32 ++, вам придется написать файл заголовка, такой как win32xx-compat.h
который определяет эти функции и #include
это перед любым заголовком Win32 ++.
Других решений пока нет …