кросплатформ как?
От: m11  
Дата: 03.06.19 04:41
Оценка: :))) :))) :)
как правельно делать кросплатформерные приложения?

Cразу началось траблы, в виндос этот код тупа не работает, файл создается R/O и запись в него не возможна.

f = open("log", O_WRONLY | O_APPEND | O_CREAT);
write(f,s,strlen(s));
close(f);

Я уж молчу что unistd.h в винде не нашлось или если файл уже открыт то его снова открыть нельзя.
Это что получатся POSIX api это миф?
А это еще не дошло до разных ньюансов типа threads.

Что же делать? Попробовать чисто С++ api?
Re[3]: кросплатформ как?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 03.06.19 06:30
Оценка: +1
Здравствуйте, m11, Вы писали:

m11>Я разобрался с Cmake так что под линух и виндой смотрю. А POSIX разве не используют уже?


В винде? Нет, естественно. Она плевала на Posix всегда с высокой колокольни (если не в WSL).

m11>А какие подлости готовит C++? Разные компиляторы не совместимые друг с другом?


И это тоже. Хотя, если ограничишься C++11, проблем будет минимум (или не будет вообще).
The God is real, unless declared integer.
Re: кросплатформ как?
От: LaptevVV Россия  
Дата: 03.06.19 04:52
Оценка:
m11>как правельно делать кросплатформерные приложения?
В какой ос, в какой IDE, с каким компилятором.
А то сидишь, небось в Студии 17 и хочешь сделать кросс, не отключив расширения языка...
Первое правило — использовать только стандартный С++.
И ксьтати, треды в STL есть.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: кросплатформ как?
От: m11  
Дата: 03.06.19 05:14
Оценка:
Здравствуйте, LaptevVV, Вы писали:

m11>>как правельно делать кросплатформерные приложения?

LVV>В какой ос, в какой IDE, с каким компилятором.
LVV>А то сидишь, небось в Студии 17 и хочешь сделать кросс, не отключив расширения языка...
LVV>Первое правило — использовать только стандартный С++.
LVV>И ксьтати, треды в STL есть.

Я разобрался с Cmake так что под линух и виндой смотрю. А POSIX разве не используют уже?
А какие подлости готовит C++? Разные компиляторы не совместимые друг с другом?
Re[3]: кросплатформ как?
От: LaptevVV Россия  
Дата: 03.06.19 05:24
Оценка:
m11>Я разобрался с Cmake так что под линух и виндой смотрю. А POSIX разве не используют уже?
m11>А какие подлости готовит C++? Разные компиляторы не совместимые друг с другом?
Если пишешь на стандартном С++ — проблем быть с переносимостью не должно.
Возможны проблемы с производительностью.
Я однажды нарвался — дек в Студии был очень плохо реализован.
Если нужен стандарт POSIX — надо в винде пакеты установить.
Почитай про MSYS2 в сети.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: кросплатформ как?
От: kov_serg Россия  
Дата: 03.06.19 06:21
Оценка:
Здравствуйте, 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++ ?
Re: кросплатформ как?
От: Zhendos  
Дата: 03.06.19 08:21
Оценка:
Здравствуйте, m11, Вы писали:

m11>Я уж молчу что unistd.h в винде не нашлось или если файл уже открыт то его снова открыть нельзя.

m11>Это что получатся POSIX api это миф?

Так POSIX же просто стандарт. Чтобы его использовать на конкретной ОС,
ОС должна ему соответствовать. С чего вы решили что Windows соответствует POSIX?
Или все эти проблемы при использовании WSL?
Re: кросплатформ как?
От: AleksandrN Россия  
Дата: 03.06.19 08:33
Оценка:
Здравствуйте, 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 = open("log", O_WRONLY | O_APPEND | O_CREAT, S_IREAD | S_IWRITE) ?


m11>Я уж молчу что unistd.h в винде не нашлось или если файл уже открыт то его снова открыть нельзя.

m11>Это что получатся POSIX api это миф?

Для UNIX-систем не миф, а для Виндовс нужны отдельные пляски с бубном.
Re[2]: кросплатформ как?
От: m11  
Дата: 03.06.19 10:17
Оценка:
Здравствуйте, AleksandrN, Вы писали:


m11>>f = open("log", O_WRONLY | O_APPEND | O_CREAT);

m11>> write(f,s,strlen(s));
m11>> close(f);

AN>Пробовал f = open("log", O_WRONLY | O_APPEND | O_CREAT, S_IREAD | S_IWRITE) ?


это работает в винде, но не в линуксе

m11>>Я уж молчу что unistd.h в винде не нашлось или если файл уже открыт то его снова открыть нельзя.

m11>>Это что получатся POSIX api это миф?

AN>Для UNIX-систем не миф, а для Виндовс нужны отдельные пляски с бубном.


Как я понял нужно делать велосипед сначало хотябы для I/O, для винды на Win32, для юниксов на допустим POSIX.
Уж тогда проще использовать C++ api.
Re: кросплатформ как?
От: Igore Россия  
Дата: 03.06.19 10:31
Оценка:
Здравствуйте, m11, Вы писали:

m11>как правельно делать кросплатформерные приложения?

Не использовать специфические функции платформ, POSIX, Win32, писать либо на чистом С++ либо использовать библиотеки где уже за тебя всё сделали.

m11>А это еще не дошло до разных ньюансов типа threads.

m11>Что же делать? Попробовать чисто С++ api?
А почему вы на С++ не захотели использовать С++ api? std::thread, std::fstream, ну или там boost взять(хотя он большой). Для начала вам похоже нужно подумать какие функции будет выполнять ваша программа, потом посмотреть входят ли они в С++, подобрать библиотеки, и начать писать.
Re[3]: кросплатформ как?
От: AleksandrN Россия  
Дата: 03.06.19 11:29
Оценка:
Здравствуйте, m11, Вы писали:

AN>>Пробовал f = open("log", O_WRONLY | O_APPEND | O_CREAT, S_IREAD | S_IWRITE) ?


m11>это работает в винде, но не в линуксе


#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define HELLO   "Hello, World!\n"

int main()
{
    int handle = open( "./hello.txt", O_WRONLY | O_APPEND | O_CREAT, S_IREAD | S_IWRITE );
    write( handle, HELLO, strlen(HELLO) );
    close( handle );

    return 0;
}


GCC это успешно собирает. Файл создаётся и данные в него записываются.
В разных заголовочных данных есть
# define S_IRUSR        __S_IREAD       /* Read by owner.  */
# define S_IWUSR        __S_IWRITE      /* Write by owner.  */
# define S_IRWXU        (__S_IREAD|__S_IWRITE|__S_IEXEC)

#define S_IRUSR __S_IREAD       /* Read by owner.  */
#define S_IWUSR __S_IWRITE      /* Write by owner.  */
#define S_IRWXU (__S_IREAD|__S_IWRITE|__S_IEXEC)
# define S_IREAD        S_IRUSR
# define S_IWRITE       S_IWUSR

#define __S_IREAD       0400    /* Read by owner.  */
#define __S_IWRITE      0200    /* Write by owner.  */
Re: кросплатформ как?
От: velkin Удмуртия https://kisa.biz
Дата: 03.06.19 13:56
Оценка:
Здравствуйте, 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 и прочие. Вот потому молодым и динамичным гораздо проще. Какой-нибудь школьник прочитав одну книгу запросто напишет то, что у матёрого виндового программиста не желающего переучиваться вызовет дикие проблемы. Хотя кроссплатформа существует уже столько времени, что её не попробовали наверное только самые большие динозавры программостроения.
Re: кросплатформ как?
От: a7d3  
Дата: 03.06.19 14:26
Оценка:
Здравствуйте, m11, Вы писали:

m11>как правельно делать кросплатформерные приложения?


Определиться с тем, какие тулчейны использовать на каждой из поддерживаемых платформ.
В случае портирования кода с линуха на винды, проще всего начать со сборки приложений в MSYS2(там MinGW внутри) или Cygwin.
Если наплевать на новые стандарты С++, то под виндой можно пользоваться http://tdm-gcc.tdragon.net/download у него есть бандл с MinGW.
Re[4]: кросплатформ как?
От: m11  
Дата: 03.06.19 15:18
Оценка:
Здравствуйте, AleksandrN, Вы писали:

AN>Здравствуйте, m11, Вы писали:


AN>>>Пробовал f = open("log", O_WRONLY | O_APPEND | O_CREAT, S_IREAD | S_IWRITE) ?


m11>>это работает в винде, но не в линуксе


AN>
AN>#include <string.h>
AN>#include <sys/types.h>
AN>#include <sys/stat.h>
AN>#include <fcntl.h>

AN>#define HELLO   "Hello, World!\n"

AN>int main()
AN>{
AN>    int handle = open( "./hello.txt", O_WRONLY | O_APPEND | O_CREAT, S_IREAD | S_IWRITE );
AN>    write( handle, HELLO, strlen(HELLO) );
AN>    close( handle );

AN>    return 0;
AN>}
AN>


А вот у меня не собирается
нету
#include <sys/types.h>
#include <sys/stat.h>

Debian, вроде как надо искать пакет этих заголовков
Re[2]: кросплатформ как?
От: m11  
Дата: 03.06.19 15:24
Оценка:
Здравствуйте, Igore, Вы писали:

m11>>А это еще не дошло до разных ньюансов типа threads.

m11>>Что же делать? Попробовать чисто С++ api?
I>А почему вы на С++ не захотели использовать С++ api? std::thread, std::fstream, ну или там boost взять(хотя он большой). Для начала вам похоже нужно подумать какие функции будет выполнять ваша программа, потом посмотреть входят ли они в С++, подобрать библиотеки, и начать писать.

Изначально я планировал писать на С. Ведь портируют же серьезные системы вроде apache mysql dig и тд
а тут оказывается проще на С++ писать
Re[2]: кросплатформ как?
От: smeeld  
Дата: 03.06.19 15:46
Оценка:
Здравствуйте, kov_serg, Вы писали:

У 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);
Re[2]: кросплатформ как?
От: dmitry_npi Россия  
Дата: 03.06.19 16:35
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Пишите так

_>
_>f=fopen("log","w+b"); if (!f) goto panic;
_>fwrite(f,"%s",s);
_>fclose(f);
_>


Действительно, почему нельзя писать так? В комментах ниже предлагают open, _open, еще что-то. Старый добрый fopen — это не стандарт разве? Я думал что это часть стандартной C библиотеки.
Атмосферная музыка — www.aventuel.net
Re[3]: кросплатформ как?
От: pagid Россия  
Дата: 03.06.19 16:44
Оценка:
Здравствуйте, smeeld, Вы писали:

S>У MS своё видение всего, они нарушают все открытые стандарты, поддержку которых заявляют. У них есть POSIX, но это не POSIX, а как бы POSIX. Так же и всё остальное в винде: не X, а как бы X.

S>Поэтому придётся делать так:

А чем
fopen("log","w+b");

таки плох?

Ну если на С остановиться.
Re[4]: кросплатформ как?
От: smeeld  
Дата: 03.06.19 17:54
Оценка:
Здравствуйте, pagid, Вы писали:

P>А чем

P>
P>fopen("log","w+b");
P>

P>таки плох?

fopen ничем не плох, но это одна из немногих POSIX функций, сотавленных MS без перекарёживания по-своему. Выше у меня иллюстрация того, как придётся в целом работать с POSIX в MS.
Re[5]: кросплатформ как?
От: pagid Россия  
Дата: 03.06.19 18:08
Оценка:
Здравствуйте, smeeld, Вы писали:

S>fopen ничем не плох, но это одна из немногих POSIX функций, сотавленных MS без перекарёживания по-своему. Выше у меня иллюстрация того, как придётся в целом работать с POSIX в MS.

А это точно POSIX функция? Не знаю есть ли она в POSIX, но это "родная" функция языка Си. Как её могли бы перекорежить даже если захотели
Re[5]: кросплатформ как?
От: Zhendos  
Дата: 03.06.19 18:17
Оценка:
Здравствуйте, 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
Re[6]: кросплатформ как?
От: smeeld  
Дата: 03.06.19 18:20
Оценка:
Здравствуйте, pagid, Вы писали:

P>А это точно POSIX функция?


Это POSIX
Re[7]: кросплатформ как?
От: pagid Россия  
Дата: 03.06.19 18:29
Оценка:
Здравствуйте, smeeld, Вы писали:

S>Это POSIX

В том смысле, что она водит в POSIX как в стандарт, но она входит и в стандартную библиотеку Си, в стандарт языка входит, и до того как приняли первый стандарт в неформальные описания языка. Изначально fopen это была функция из стандартной библиотеки Си, а open() — системный вызов UNIX, задолго до того, как за разработку POSIX'а взялись.
Re[3]: кросплатформ как?
От: Pzz Россия https://github.com/alexpevzner
Дата: 03.06.19 18:44
Оценка:
Здравствуйте, smeeld, Вы писали:

S>Поэтому придётся делать так:


В обеих версиях open'а, если предполагается создание файла, нужен третий параметр — пермиссии нового файла.
Re[6]: кросплатформ как?
От: pagid Россия  
Дата: 03.06.19 19:01
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>Но с fopen конечно есть проблемы, как и любая функция принимающая "char *",

Z>у нее проблемы с не ASCII именами файлов, а их удивительно много на машинах обычных пользователей.

У _open() те же проблемы. В этом отношении оно ничем не лучше


Z>MS недавно добавили: `fopen("newfile.txt", "rt+, ccs=UTF-8")`, но насколько новый C Runtime нужно

Если не ошибаюсь это не о имени файла, а о его содержимом.

Z>овместим ли такой способ с Linux/glibc

Вроде как игнорироваться должно, если там нет аналогичного.
Отредактировано 03.06.2019 19:42 pagid . Предыдущая версия .
Re[4]: кросплатформ как?
От: smeeld  
Дата: 03.06.19 20:14
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>В обеих версиях open'а, если предполагается создание файла, нужен третий параметр — пермиссии нового файла.


Это и ежу понятно. Выше псевдокод-иллюстрация про #define с _MSC_VER и _open c open. То, чем напичкан кроссплатформенный код на Сях. Там ещё куча всего, вроде возни c dllimport/dllexport, разницы в разрядности встроенных типов, чудесный MS-вский препроцессор, нарушающий стандарты, чем ТС набьёт немало шишек, расписывая кроссплатформ на Сях.
Re[5]: кросплатформ как?
От: AleksandrN Россия  
Дата: 04.06.19 05:05
Оценка:
Здравствуйте, m11, Вы писали:

m11>
m11>#include <sys/types.h>
m11>#include <sys/stat.h>
m11>

m11>Debian, вроде как надо искать пакет этих заголовков

apt-get install libc6-dev
Re[3]: кросплатформ как?
От: AleksandrN Россия  
Дата: 04.06.19 05:17
Оценка:
Здравствуйте, m11, Вы писали:

m11>Изначально я планировал писать на С. Ведь портируют же серьезные системы вроде apache mysql dig и тд

m11>а тут оказывается проще на С++ писать

И на C и на C++ для всего, что не входит в стандартную бибилиотеку и что является платформо-зависимым нужно писать
#ifdef <макрос, определяющий платформу>
// платформозависимый код
#else
// платформозависимый код
#endif


либо использовать библиотеку, в которой уже реализован нужный функционал для разных платформ.


Например — заглянул я сейчас в исходники Апача. Увидел такой код (server/util_script.c):
#if defined(WIN32)
    env2env(e, r, "SystemRoot", NULL);
    env2env(e, r, "COMSPEC", NULL);
    env2env(e, r, "PATHEXT", NULL);
    env2env(e, r, "WINDIR", NULL);
#elif defined(OS2)
    env2env(e, r, "COMSPEC", NULL);
    env2env(e, r, "ETC", NULL);
    env2env(e, r, "DPATH", NULL);
    env2env(e, r, "PERLLIB_PREFIX", NULL);
#elif defined(BEOS)
    env2env(e, r, "LIBRARY_PATH", NULL);
#elif defined(DARWIN)
    env2env(e, r, "DYLD_LIBRARY_PATH", NULL);
#elif defined(_AIX)
    env2env(e, r, "LIBPATH", NULL);
#elif defined(__HPUX__)
    /* HPUX PARISC 2.0W knows both, otherwise redundancy is harmless */
    env2env(e, r, "SHLIB_PATH", NULL);
    env2env(e, r, "LD_LIBRARY_PATH", NULL);
#else /* Some Unix */
    env2env(e, r, "LD_LIBRARY_PATH", NULL);
#endif
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.