Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
 Аватар для LVV
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750

Использование компилятора

28.07.2018, 09:12. Показов 1108. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется С++ код, например, такой:
C++
1
2
3
4
5
6
#include <iostream>
int main ()
{
std::cout << "Hello, World!"
return 0;
}
Хочу сделать консольное С++ приложение, которое бы:
1) Отправляло на компиляцию указанный код
2) Сохраняло в нужном месте откомпилированный файл.

Не пойму с чего начать.
-Где искать компилятор, если на машине установлена, например, Visual Studio или другая среда?
-Как отправить код для выполнения компилятором?
-Где потом найти созданный компилятором исполнимый exe-файл?

Подскажите, или дайте ссылки, где почитать об этом...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.07.2018, 09:12
Ответы с готовыми решениями:

Использование атрибутов компилятора
Добрый день. Известно, в C++ есть ключевое слово __attribute__Вопрос: когда имеет смысл его использовать? Например, если у меня...

Директивы компилятора
Имеется такой код: #define MAT(m,r,c) (m) #define m11 MAT(m,0,0) #define m12 MAT(m,0,1) #define m13 MAT(m,0,2) #define m14...

Ошибка компилятора
Пишет на последнюю строчку, что требуется while и синтаксическая ошибка } #include &quot;stdafx.h&quot; #include &lt;iostream&gt; ...

17
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
28.07.2018, 09:38
В чём суть задачи? Это делается обычно сценарием типа bat/cmd.
0
Заклинатель змей
 Аватар для DobroAlex
705 / 560 / 219
Регистрация: 30.04.2016
Сообщений: 2,605
28.07.2018, 11:21
LVV, https://m.habr.com/post/215835/
1
 Аватар для LVV
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
28.07.2018, 11:53  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
В чём суть задачи?
Исходные данные:
Есть консольное С++ приложение.
Есть символьный код, например, в переменной типа std::string.
На машине установлен Visual Studio.

Нужно:
Средствами консольного приложения передать код компилятору С++ и сохранить скомпилированный файл в папке проекта.

Например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string s = "#include <iostream>\
                 int main ()\
                {\
                std::cout << "Hello, World!"\
                return 0;\
                }"
return 0;
}
Дальше что делать?

Добавлено через 13 минут
Цитата Сообщение от DobroAlex Посмотреть сообщение
https://m.habr.com/post/215835/
Спасибо, DobroAlex, только мне нужен образец кода на "чистом" С++.

"-А у Вас есть с перламутровыми пуговицами?
-Нет.
-Будем искать."
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
28.07.2018, 11:59
Цитата Сообщение от LVV Посмотреть сообщение
только мне нужен образец кода на "чистом" С++
1) сохранить строку в файл
2) с помощью вызова system() по очереди запускать строки из того батника (только нужные и с прописанными нужными файлами и путями)
1
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
28.07.2018, 15:59
Цитата Сообщение от LVV Посмотреть сообщение
Хочу сделать консольное С++ приложение, которое бы:
1) Отправляло на компиляцию указанный код
2) Сохраняло в нужном месте откомпилированный файл.
Вам нужно именно скомпилировать код или просто выполнить введенный с клавиатуры скрипт? Если второе, то берите лучше Перл/Питон, ибо им компиляция не нужна. Собственно, простые перл-скрипты даже в файл сохранять не нужно, можно прям из командной строки запускать - perl -e 'print "test";print "test";print "test"'.
0
 Аватар для LVV
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
28.07.2018, 18:20  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
запускать строки из того батника
Цитата Сообщение от Renji Посмотреть сообщение
Вам нужно именно скомпилировать код или просто выполнить введенный с клавиатуры скрипт?
Мне нужно именно скомпилировать код.
На входе имеется символьная строка, на выходе - скомпилированный файл.

Зачем это мне нужно?
Сделал программку, проверяющую решения задач типа: дано/найти. На входе программа получает - скомпилированный exe-файл. На выходе - результат прохождения контрольных тестов.

Теперь же хочу сделать, чтобы на входе был не ехе-шник, а срр-код.
0
 Аватар для COKPOWEHEU
4079 / 2677 / 432
Регистрация: 09.09.2017
Сообщений: 11,888
29.07.2018, 09:06
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/bash
 
mkdir -p res
 
for i in `ls src` ; do
  ls src/$i
  gcc src/$i -o res/a.out -Wall -Wextra -Werror 2>/dev/null
  if (( $? != 0 )) ; then
    echo "Can not compile file "src/$i
    echo ""
    continue
  fi
  
  errtest=1
  errflag=1
  
  for j in `ls ./tests/*.in` ; do
    y=`echo $j | sed -e 's\.in\.out\g'`
    ./res/a.out < $j > ./res/a.res
    diff ./res/a.res $y >/dev/null
    if (( $? != 0 )) ; then
      errflag=0
      break
    else
      (( errtest ++ ))
    fi
  done
  
  if (( ! $errflag )) ; then
    echo 'err #'$errtest
  else
    echo 'Success'
  fi
  echo ""
done
1
 Аватар для LVV
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
30.07.2018, 07:51  [ТС]
COKPOWEHEU, и как это "влепить" сюда:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <string>
using namespace std;
int main ()
{
 
 
 
return 0;
}
Цитата Сообщение от nmcf Посмотреть сообщение
Это делается обычно сценарием типа bat/cmd.
Ну, нашел я ярлык, запускающий командную строку Visual Studio.
С командной строки могу скомпилировать файл Hello.cpp по команде CL /EHsc [путь]

Но, это всё в ручном режиме.
А через консольное приложение не получается.
Вот путь к bat-нику командной строки:
C:\Program Files(x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\VsDe vCmd.bat

Но через sistem не могу открыть командную строку (не говоря уже о том, чтобы задать ей параметры: CL /EHsc [путь к файлу])
C++
1
2
3
4
5
6
7
#include <iostream>
using namespace std;
int main()
{
system("start /D \"C:\\Program Files(x86)\\Microsoft Visual Studio\\2017\\Community\\Common7\\Tools\\\" VsDevCmd.bat");
return 0;
}
Пишет: "Не удаётся найти файл VsDevCmd.bat". (смотрите рисунок)

Вопрос 1:
Почему "не удаётся найти файл", если я в ручном режиме его нахожу в указанном месте и двойным кликом открываю командную строку Visual Studio? Что я не так прописываю в system?

Вопрос 2:
А если мне нужно задать параметры для командной строки, то нужно делать так:
system("start /D "C:\\Program Files(x86)\\Microsoft Visual Studio\\2017\\Community\\Common7\\Tools" VsDevCmd.bat CL /EHsc [путь к срр-файлу]");
Или не так?
Миниатюры
Использование компилятора  
0
 Аватар для LVV
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
30.07.2018, 07:56  [ТС]
вернее, так:
system("start /D "C:\\Program Files(x86)\\Microsoft Visual Studio\\2017\\Community\\Common7\\Tools" "VsDevCmd.bat CL /EHsc [путь к срр-файлу]"");
Или не так?

Почему-то съелись обратные слеши перед кавычками в параметре к командной строке ".
0
 Аватар для LVV
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
30.07.2018, 08:06  [ТС]
Вот это правильная структура?
Миниатюры
Использование компилятора  
0
 Аватар для LVV
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
30.07.2018, 08:10  [ТС]
Вот
Миниатюры
Использование компилятора  
0
 Аватар для COKPOWEHEU
4079 / 2677 / 432
Регистрация: 09.09.2017
Сообщений: 11,888
30.07.2018, 10:01
Цитата Сообщение от LVV Посмотреть сообщение
COKPOWEHEU, и как это "влепить" сюда:
Напрямую никак, разве что через system() вызвать. Это обычный скрипт, компилирующий все файлы из ./src/ и прогоняющий по тестам из ./tests/ с выдачей на каком тесте произошла ошибка.
1
 Аватар для LVV
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
30.07.2018, 11:43  [ТС]
Спасибо, COKPOWEHEU. Подумаю, как его пришить к моему проекту...

А пока "вернёмся к нашим баранам"
Я поместил текстовый файл в папку Program Files:
C++
1
2
system("start /D \"C:\\Program Files(x86)\" Hello.txt");
system("start /D \"C:\\Program Files(x86)\\\" Hello.txt");
Выдало: "Неправильно указан текущий каталог.

Поместил то же текстовый файл в папку Windows:
C++
1
2
system("start /D \"C:\\Windows\" Hello.txt");
system("start /D \"C:\\Windows\\\" Hello.txt");
И файл открылся (дважды).

Кажется, system не хочет читать пробелы?

Создал свою папку на диске С.
С неё system прекрасно читает файл.
C++
1
system("start /D \"C:\\Моя папка\" Hello.txt");
Значит дело не в пробелах. Может с правами администратора проблемы у system (хотя почему открывает из Windows и не открывает из Program Files(x86)
Как с этим справиться - не знаю.

Попробовал через API используя ShellExecute с авторскими правами:
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <windows.h>
#include <Shellapi.h>
using namespace std;
int main()
{
ShellExecute(NULL, L"runas", L"\"C:\\Program Files(x86)\\Microsoft Visual Studio\\2017\\Community\\Common7\\Tools\\VsDevCmd.bat\"", NULL, NULL, SW_RESTORE);
return 0;
}
Но результат нулевой. Командная строка Visual Studio не подключается.
Всё работает. Процесс завершается без ошибок. Но нет ожидаемого результата - командной строки.

Поместил в папку текстовый файл, но он тоже не открывается:
C++
1
ShellExecute(NULL, L"runas", L"\"C:\\Program Files(x86)\\Microsoft Visual Studio\\2017\\Community\\Common7\\Tools\\Hello.txt\"", NULL, NULL, SW_RESTORE);
Поместил текстовый файл непосредственно в Program Files(x86) и такой же - в папку Windows. Но он тоже не открывается.
C++
1
2
ShellExecute(NULL, L"runas", L"\"C:\\Program Files(x86)\\Hello.txt\"", NULL, NULL, SW_RESTORE);
ShellExecute(NULL, L"runas", L"\"C:\\Windows\\Hello.txt\"", NULL, NULL, SW_RESTORE);
Даже просто на диске С или D текстовый файл не открывается.
C++
1
2
ShellExecute(NULL, L"runas", L"\"C:\\Hello.txt\"", NULL, NULL, SW_RESTORE);
ShellExecute(NULL, L"runas", L"\"D:\\Hello.txt\"", NULL, NULL, SW_RESTORE);
Что опять не так?
0
 Аватар для COKPOWEHEU
4079 / 2677 / 432
Регистрация: 09.09.2017
Сообщений: 11,888
30.07.2018, 11:44
Цитата Сообщение от LVV Посмотреть сообщение
Кажется, system не хочет читать пробелы...
Вот так работает, по крайней мере если компилировать в mingw
C
1
system("dir "C:\\Program Files"");
0
 Аватар для LVV
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
30.07.2018, 11:52  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Вот так работает, по крайней мере если компилировать в ming
Так и у меня на Visual Studio работает. Я уже понял, что дело не в пробелах. (дописал там чуть чуть в своём посте).
Только мне нужно не директории... а файл открыть.

Наверное всё же нужно открывать файл от имени администратора.
Как это сделать через system - не знаю. Поэтому попробовал через ShellExecute. Но ничего не получается. Даже то, что открывалось через system, в ShellExecute не открывается. Видимо, что-то не так я прописываю...
Но что?
0
415 / 150 / 48
Регистрация: 02.06.2016
Сообщений: 364
30.07.2018, 11:54
Цитата Сообщение от LVV Посмотреть сообщение
А через консольное приложение не получается.
Вам нужно перед вызовом компилятора указать переменные окружения, примерно так (это от версии студии зависит), через точку с запятой (т.е. где многоточие там другие пути).
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
int main()
{
    putenv("PATH=C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\bin;...");
    putenv("INCLUDE=C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\include;...");
    putenv("LIB=C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\lib;...");
 
    system("cl.exe /nologo /W3 /EHsc /Ox /MT D:\\test\\input\\main.cpp /FeD:\\test\\output\\test.exe");
    return 0;
}
1
 Аватар для LVV
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
30.07.2018, 22:08  [ТС]
Никогда не использовал putenv().
Пошел разбираться, что и как...
Спасибо за подсказку, GoshaM.

Добавлено через 10 часов 2 минуты
Ну, в общем разобрался...
Вот четыре рабочих способа открытия командной строки Visual Studio Community 2017
(может кому пригодится)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <windows.h>
#include <Shellapi.h>
#include <process.h>
using namespace std;
int main()
{
//////////////  1  //////////////
    STARTUPINFO cif;
    ZeroMemory(&cif, sizeof(STARTUPINFO));
    PROCESS_INFORMATION pi;
    CreateProcess(L"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Common7\\Tools\\VsDevCmd.bat", NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &cif, &pi);
 
 
//////////////  2  //////////////
    system("start /D \"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Common7\\Tools\\\" VsDevCmd.bat");
 
 
//////////////  3  //////////////
    ShellExecuteA(NULL, NULL, "\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Common7\\Tools\\\" VsDevCmd.bat\"", NULL, NULL, SW_RESTORE);
 
 
//////////////  4  //////////////
    spawnlp(P_WAIT, "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Common7\\Tools\\VsDevCmd.bat", "10", NULL);
        
    return 0;
}
Осталось с параметрами запуска компилятора и прочее поколдовать.
(не знаю, почему сразу не открывалось... Может из-за отсутствия <process.h>)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.07.2018, 22:08
Помогаю со студенческими работами здесь

Смена Компилятора
Здравствуйте! :help: Начну с того, что программа работает в Visual Studio C++ 2008, но когда я пытаюсь ее переместить на другой...

Ошибка компилятора
Всем привет. Начну с самого конца. Есть некий файл SpellItemEnchantment.dbc - это просто хранилище значений (массив), его структура описана...

Выбор компилятора С++
Всем доброго времени суток.Такой вопрос:Какой компилятор или среду разработки взять для начала изучения С++? На Паскале писал,с Delphi...

Ошибка компилятора
Не работает cout и cin Visual Studio 2008 Помогите пожалуста кто может:wall::wall::wall:

Ошибка Компилятора в C++
Здравствуйте дорогие программисты. Код очень странно работает. После того как он доходит до конца, он начинает игнорировать все cin -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru