#c #linux #windows
#c #linux #Windows
Вопрос:
У меня есть файл C, который я могу запустить в терминале Linux (Ubuntu), но когда я пытаюсь запустить файл C в Visual Studio 2019 в Windows 10, он не может запуститься, он говорит, что не может открыть исходный файл ( unistd.h
, sys/wait.h
, …). Почему Linux (Ubuntu) может работать, а Visual Studio нет? Спасибо!
Комментарии:
1. Какой
.h
именно файл? Это часть вашего исходного кода или нет?2. Вызывается ли отсутствующий файл заголовка буквально
header.h
? Это не стандартный заголовок библиотеки или тот, который я ожидал бы в сторонней библиотеке. Так что, вероятно, это часть вашей базы кода, то есть вам нужно будет скопировать вместе с вашим файлом .c (и любыми другими файлами .c и .h, которые могут быть частью вашего проекта).3. Да, это часть исходного кода, Ubuntu довольно тяжелый (я использую VirtualBox), поэтому я пытаюсь запустить файл C в Windows. Заголовочные файлы
unistd.h
,sys/wait.h
,…4. @sepp2k, нет, есть много заголовочных файлов, которые нельзя открыть, но я просто позвонил
header.h
для краткости.5. «Этот вопрос не показывает каких-либо исследовательских усилий».
Ответ №1:
когда я пытаюсь запустить файл C с Visual Studio 2019 в Windows 10, он не может запуститься, он говорит, что не может открыть исходный файл (unistd.h, sys / wait.h, …). Почему Linux (Ubuntu) может работать, а Visual Studio нет? Спасибо!
Поскольку файлы заголовков <unistd.h>
(см., Например, Системные вызовы (2), fork (2) и т. Д.) И <sys/wait.h>
(см. waitpid (2)) специфичны для стандарта POSIX, и, к сожалению, Windows не соответствует POSIX. Я слышал о подсистеме Windows для Linux, которая, по слухам, является некоторым уровнем совместимости.
По слухам, у Windows есть собственный Windows API.
Стандарт C имеет небольшой и довольно бедный API, например fopen
, fprintf
amp; malloc
(он не знает о каталогах или процессах). Прочитайте современный C и некоторые стандарты C, такие как n1570 или новее. Вы могли бы закодировать на C (используя кросс-компилятор) какой-нибудь микроконтроллер, такой как Arduino — у них нет никаких операционных систем или файлов.
Кстати, вы не запускаете файл, вы его компилируете, а в Linux вам лучше использовать gcc -Wall -Wextra -g
для его компиляции и получения предупреждений и информации об отладке. После того, как ваша программа была отлажена с помощью GDB и Valgrind (и, возможно, даже с помощью средства очистки адресов), вы можете попросить компилятор GCC оптимизировать его, добавив -O3
.
Возможным подходом может быть использование некоторой библиотеки framework, которая была перенесена как на Linux, так и на Windows. Вы можете попробовать использовать GTK. Он предоставляет вам общий API (документированный набор типов, объявленных функций и заголовочных файлов), который реализован в Linux, Windows и MacOSX. При некоторой осторожности набор файлов C, использующих GTK в Linux, может быть перекомпилирован в Windows (с доступным в нем GTK).
Если вы можете позволить себе изучение C (см. Эту ссылку и прочитайте Programming — Принципы и практика использования C ), вы можете рассмотреть возможность использования фреймворков C , таких как Qt или POCO. Обратите внимание, что изучение C требует месяцев усилий.
Я рекомендую изучить для вдохновения исходный код существующего программного обеспечения с открытым исходным кодом, такого как GNU bash, GNU make, ninja, RefPerSys или FLTK и т. Д. Вы бы многому научились, внеся свой вклад в один из них.
Комментарии:
1. Итак, я просто включаю GTK и могу компилировать в Visual Studio, верно?
2. @abcd Нет. В этом ответе просто говорится, что если бы программа была написана с использованием GTK вместо того, что она использует сейчас, она могла бы работать под MSVC из коробки.
3. О, теперь я понял. Спасибо!
Ответ №2:
Попробуйте загрузить GNU GCC и запустить его из командной строки.
$ gcc -Wall file.c -o file
$ ./file
Комментарии:
1. @abcd Вы можете получить GCC в Windows, да, но у меня его нет
sys/wait.h
. Он должен быть у Cygwin.2. Я не понимаю, я устанавливаю GCC в Linux, и он может скомпилировать файл C, но почему GCC в Windows не может скомпилироваться? Разве GCC в Linux и Windows не одинаковы.
3. Нет, GCC в Linux и GCC в Windows разные . В Linux GCC будет создавать (косвенно) файлы ELF . В Windows это даст PE -файлы!