printf не печатает на консоль - PullRequest
0 голосов
/ 07 апреля 2020

Использование VS 2019 для создания C программы для запуска в Windows Подсистема Linux (Ubuntu). Компиляция с использованием gcc starfire.c в качестве первоначальной цели программы была для чего-то другого, но превратилась в эту ошибку sh.

void main() {
    printf("print this");
    return;
}

Я пытался использовать fflush(stdout) и setbuf(stdout, NULL), и ни работают. Пожалуйста, помогите?

РЕДАКТИРОВАТЬ: Я также пытался использовать \n, так что это тоже не так. Я также использую #include <stdio.h>, и он по-прежнему просто отказывается работать.

1 Ответ

1 голос
/ 07 апреля 2020

64-битное соглашение о вызовах x86: отличается для windows и linux.

См .: https://en.wikipedia.org/wiki/X86_calling_conventions В частности, Microsoft x64 «Соглашение о вызовах» и «System V AMD64 ABI».

В Windows первые четыре аргумента передаются в регистрах. Но при linux первые шесть аргументов передаются в регистрах.

И какой регистр содержит, какой аргумент [снова] отличается:

            arg0    arg1    arg2    arg3    arg4    arg5
Windows:    RCX     RDX     R8      R9
Linux:      RDI     RSI     RDX     RCX     R8      R9

Кроме того, какие регистры должны быть сохранены вызываемым пользователем, который может быть уничтожен, и т. Д. c.

Использование gcc в Windows (cygwin или mingw) будет использовать соглашение MS. Использование gcc под WSL будет использовать соглашение Ubuntu / linux SysV ABI (т.е. linux).

Таким образом, вы не можете просто сделать кросс-компиляцию без какой-либо опции, чтобы сказать компилятору используйте правильное соглашение о вызовах. Также, возможно, есть проблемы с динамическими c библиотеками (под MS они .dll, но под linux они .so).

Также windows использует PE формат (переносимый исполняемый файл) [полученный из формата SysV COFF]. Но linux использует ELF объектный / двоичный исполняемый формат.

Примечание: IIR C, MS просто решила поддерживать VS под linux [но это совсем недавно ], так что вы можете получить некоторое облегчение там.

Но, IMO, я бы просто использовал gcc et. и др. под WSL / ubuntu / linux. И, , если вам действительно нужна IDE, попробуйте Eclipse.

Вы можете попытаться получить VS для перекрестной сборки, но, IMO, знак на стене: Оставьте надежду всем, кто войдет сюда


ОБНОВЛЕНИЕ:

Предупреждение: Я разместил выше основано на оригинальном посте ФП [без каких-либо комментариев из верхних комментариев (о том, как gcc использовалось)]. Но чем больше я об этом думаю, тем меньше в этом смысла.

Но возникает вопрос: используете ли вы WSL или WSL2? Они реализованы по-разному.

С WSL MS просто добавила дополнительную поддержку linux совместимого интерфейса syscall для ядра win10. Он может выполнять ограниченное количество программ. AFAIK, программы все еще использовали собственную файловую систему NTFS. Вы не используете linux ядро ​​, просто выполняете некоторые linux ABI-совместимые исполняемые файлы.

С WSL2 MS внедрила облегченную виртуальную машину [похоже на vmware или virtualbox], позволяющее запустить полное ядро ​​Ubuntu / linux. При этом вы можете установить Ubuntu, загрузив ВМ из «живой» установки Ubuntu .iso (прямо с сайта Ubuntu). Затем он устанавливается [в значительной степени] точно так же, как и нативная установка Ubuntu.

Поскольку WSL2 является виртуальной машиной, вы можете установить fedora, suse, mint и др. c. аналогичным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...