как правельно делать кросплатформерные приложения?
Cразу началось траблы, в виндос этот код тупа не работает, файл создается R/O и запись в него не возможна.
f = open("log", O_WRONLY | O_APPEND | O_CREAT);
write(f,s,strlen(s));
close(f);
Я уж молчу что unistd.h в винде не нашлось или если файл уже открыт то его снова открыть нельзя.
Это что получатся POSIX api это миф?
А это еще не дошло до разных ньюансов типа threads.
m11>как правельно делать кросплатформерные приложения?
В какой ос, в какой IDE, с каким компилятором.
А то сидишь, небось в Студии 17 и хочешь сделать кросс, не отключив расширения языка...
Первое правило — использовать только стандартный С++.
И ксьтати, треды в STL есть.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
m11>>как правельно делать кросплатформерные приложения? LVV>В какой ос, в какой IDE, с каким компилятором. LVV>А то сидишь, небось в Студии 17 и хочешь сделать кросс, не отключив расширения языка... LVV>Первое правило — использовать только стандартный С++. LVV>И ксьтати, треды в STL есть.
Я разобрался с Cmake так что под линух и виндой смотрю. А POSIX разве не используют уже?
А какие подлости готовит C++? Разные компиляторы не совместимые друг с другом?
m11>Я разобрался с Cmake так что под линух и виндой смотрю. А POSIX разве не используют уже? m11>А какие подлости готовит C++? Разные компиляторы не совместимые друг с другом?
Если пишешь на стандартном С++ — проблем быть с переносимостью не должно.
Возможны проблемы с производительностью.
Я однажды нарвался — дек в Студии был очень плохо реализован.
Если нужен стандарт POSIX — надо в винде пакеты установить.
Почитай про MSYS2 в сети.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, m11, Вы писали:
m11>как правельно делать кросплатформерные приложения?
m11>Cразу началось траблы, в виндос этот код тупа не работает, файл создается R/O и запись в него не возможна.
m11>f = open("log", O_WRONLY | O_APPEND | O_CREAT); m11> write(f,s,strlen(s)); m11> close(f);
Пишите так
f=fopen("log","w+b"); if (!f) goto panic;
fwrite(f,"%s",s);
fclose(f);
m11>Что же делать? Попробовать чисто С++ api?
А зачем вам именно C++ ?
Здравствуйте, m11, Вы писали:
m11>Я разобрался с Cmake так что под линух и виндой смотрю. А POSIX разве не используют уже?
В винде? Нет, естественно. Она плевала на Posix всегда с высокой колокольни (если не в WSL).
m11>А какие подлости готовит C++? Разные компиляторы не совместимые друг с другом?
И это тоже. Хотя, если ограничишься C++11, проблем будет минимум (или не будет вообще).
Здравствуйте, m11, Вы писали:
m11>Я уж молчу что unistd.h в винде не нашлось или если файл уже открыт то его снова открыть нельзя. m11>Это что получатся POSIX api это миф?
Так POSIX же просто стандарт. Чтобы его использовать на конкретной ОС,
ОС должна ему соответствовать. С чего вы решили что Windows соответствует POSIX?
Или все эти проблемы при использовании WSL?
Здравствуйте, m11, Вы писали:
m11>как правельно делать кросплатформерные приложения?
m11>Cразу началось траблы, в виндос этот код тупа не работает, файл создается R/O и запись в него не возможна.
m11>f = open("log", O_WRONLY | O_APPEND | O_CREAT); m11> write(f,s,strlen(s)); m11> close(f);
это работает в винде, но не в линуксе
m11>>Я уж молчу что unistd.h в винде не нашлось или если файл уже открыт то его снова открыть нельзя. m11>>Это что получатся POSIX api это миф?
AN>Для UNIX-систем не миф, а для Виндовс нужны отдельные пляски с бубном.
Как я понял нужно делать велосипед сначало хотябы для I/O, для винды на Win32, для юниксов на допустим POSIX.
Уж тогда проще использовать C++ api.
Здравствуйте, m11, Вы писали:
m11>как правельно делать кросплатформерные приложения?
Не использовать специфические функции платформ, POSIX, Win32, писать либо на чистом С++ либо использовать библиотеки где уже за тебя всё сделали.
m11>А это еще не дошло до разных ньюансов типа threads. m11>Что же делать? Попробовать чисто С++ api?
А почему вы на С++ не захотели использовать С++ api? std::thread, std::fstream, ну или там boost взять(хотя он большой). Для начала вам похоже нужно подумать какие функции будет выполнять ваша программа, потом посмотреть входят ли они в С++, подобрать библиотеки, и начать писать.
Здравствуйте, m11, Вы писали:
AN>>Пробовал f = open("log", O_WRONLY | O_APPEND | O_CREAT, S_IREAD | S_IWRITE) ?
m11>это работает в винде, но не в линуксе
Здравствуйте, m11, Вы писали:
m11>как правильно делать кроссплатформенные приложения?
Проще всего изначально использовать:
1) Кроссплатформенные IDE (qt creator, code::blocks, netbeans, eclipse, ...)
2) Кроссплатформенные системы сборки (cmake, qmake, ...)
3) Кроссплатформенные компиляторы (gcc, mingw, ...)
4) Кроссплатформенные библиотеки (boost, qt, sdl, ...)
Кроссплатформенных библиотек огромное множество на все случаи жизни. Их применение гораздо удобнее в GNU/Linux, хотя это и не принципиально. Так же есть такое понятие как кросскомпиляция. А вот уже потом создав кроссплафторменное приложение и убедившись, что оно работает в разных операционных системах, можно провести опыты с не кроссплатформенными ide, системами сборки, компиляторами, может быт даже библиотеками. Хотя в этом и нет особого смысла, только искать себе лишние проблемы.
m11>Я уж молчу что unistd.h в винде не нашлось ... m11>А это еще не дошло до разных ньюансов типа threads.
Кому какая разница, что там в винде не нашлось, а для потоков исполнения есть те же boost, qt и прочие. Вот потому молодым и динамичным гораздо проще. Какой-нибудь школьник прочитав одну книгу запросто напишет то, что у матёрого виндового программиста не желающего переучиваться вызовет дикие проблемы. Хотя кроссплатформа существует уже столько времени, что её не попробовали наверное только самые большие динозавры программостроения.
Здравствуйте, m11, Вы писали:
m11>как правельно делать кросплатформерные приложения?
Определиться с тем, какие тулчейны использовать на каждой из поддерживаемых платформ.
В случае портирования кода с линуха на винды, проще всего начать со сборки приложений в MSYS2(там MinGW внутри) или Cygwin.
Если наплевать на новые стандарты С++, то под виндой можно пользоваться http://tdm-gcc.tdragon.net/download у него есть бандл с MinGW.
Здравствуйте, AleksandrN, Вы писали:
AN>Здравствуйте, m11, Вы писали:
AN>>>Пробовал f = open("log", O_WRONLY | O_APPEND | O_CREAT, S_IREAD | S_IWRITE) ?
m11>>это работает в винде, но не в линуксе
AN>
Здравствуйте, Igore, Вы писали:
m11>>А это еще не дошло до разных ньюансов типа threads. m11>>Что же делать? Попробовать чисто С++ api? I>А почему вы на С++ не захотели использовать С++ api? std::thread, std::fstream, ну или там boost взять(хотя он большой). Для начала вам похоже нужно подумать какие функции будет выполнять ваша программа, потом посмотреть входят ли они в С++, подобрать библиотеки, и начать писать.
Изначально я планировал писать на С. Ведь портируют же серьезные системы вроде apache mysql dig и тд
а тут оказывается проще на С++ писать
У MS своё видение всего, они нарушают все открытые стандарты, поддержку которых заявляют. У них есть POSIX, но это не POSIX, а как бы POSIX. Так же и всё остальное в винде: не X, а как бы X.
Поэтому придётся делать так:
#if defined MSC_VER
f = _open("log", _O_WRONLY | _O_APPEND | _O_CREAT);
_write(f,s,strlen(s));
_close(f);
#else
f = open("log", O_WRONLY | O_APPEND | O_CREAT);
write(f,s,strlen(s));
close(f);
Здравствуйте, kov_serg, Вы писали:
_>Пишите так _>
_>f=fopen("log","w+b"); if (!f) goto panic;
_>fwrite(f,"%s",s);
_>fclose(f);
_>
Действительно, почему нельзя писать так? В комментах ниже предлагают open, _open, еще что-то. Старый добрый fopen — это не стандарт разве? Я думал что это часть стандартной C библиотеки.
Здравствуйте, smeeld, Вы писали:
S>У MS своё видение всего, они нарушают все открытые стандарты, поддержку которых заявляют. У них есть POSIX, но это не POSIX, а как бы POSIX. Так же и всё остальное в винде: не X, а как бы X. S>Поэтому придётся делать так:
fopen ничем не плох, но это одна из немногих POSIX функций, сотавленных MS без перекарёживания по-своему. Выше у меня иллюстрация того, как придётся в целом работать с POSIX в MS.
Здравствуйте, smeeld, Вы писали:
S>fopen ничем не плох, но это одна из немногих POSIX функций, сотавленных MS без перекарёживания по-своему. Выше у меня иллюстрация того, как придётся в целом работать с POSIX в MS.
А это точно POSIX функция? Не знаю есть ли она в POSIX, но это "родная" функция языка Си. Как её могли бы перекорежить даже если захотели
Здравствуйте, smeeld, Вы писали:
S>Здравствуйте, pagid, Вы писали:
S>fopen ничем не плох, но это одна из немногих POSIX функций, сотавленных MS без перекарёживания по-своему. Выше у меня иллюстрация того, как придётся в целом работать с POSIX в MS.
fopen же не только POSIX функция, но и С89 и C99 функция,
еще бы ее перекорежили.
Но с fopen конечно есть проблемы, как и любая функция принимающая "char *",
у нее проблемы с не ASCII именами файлов, а их удивительно много на машинах обычных пользователей.
MS недавно добавили: `fopen("newfile.txt", "rt+, ccs=UTF-8")`, но насколько новый C Runtime нужно
к своему приложению прилинковывать чтобы это работало и совместим ли такой способ с
Linux/glibc
Здравствуйте, smeeld, Вы писали:
S>Это POSIX
В том смысле, что она водит в POSIX как в стандарт, но она входит и в стандартную библиотеку Си, в стандарт языка входит, и до того как приняли первый стандарт в неформальные описания языка. Изначально fopen это была функция из стандартной библиотеки Си, а open() — системный вызов UNIX, задолго до того, как за разработку POSIX'а взялись.
Здравствуйте, Zhendos, Вы писали:
Z>Но с fopen конечно есть проблемы, как и любая функция принимающая "char *", Z>у нее проблемы с не ASCII именами файлов, а их удивительно много на машинах обычных пользователей.
У _open() те же проблемы. В этом отношении оно ничем не лучше
Z>MS недавно добавили: `fopen("newfile.txt", "rt+, ccs=UTF-8")`, но насколько новый C Runtime нужно
Если не ошибаюсь это не о имени файла, а о его содержимом.
Z>овместим ли такой способ с Linux/glibc
Вроде как игнорироваться должно, если там нет аналогичного.
Здравствуйте, Pzz, Вы писали:
Pzz>В обеих версиях open'а, если предполагается создание файла, нужен третий параметр — пермиссии нового файла.
Это и ежу понятно. Выше псевдокод-иллюстрация про #define с _MSC_VER и _open c open. То, чем напичкан кроссплатформенный код на Сях. Там ещё куча всего, вроде возни c dllimport/dllexport, разницы в разрядности встроенных типов, чудесный MS-вский препроцессор, нарушающий стандарты, чем ТС набьёт немало шишек, расписывая кроссплатформ на Сях.
Здравствуйте, m11, Вы писали:
m11>Изначально я планировал писать на С. Ведь портируют же серьезные системы вроде apache mysql dig и тд m11>а тут оказывается проще на С++ писать
И на C и на C++ для всего, что не входит в стандартную бибилиотеку и что является платформо-зависимым нужно писать