Не удается запустить файл C в Visual Studio

#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 -файлы!