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

Как передать параметры компилятору?

21.08.2018, 17:07. Показов 3337. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В ручном режиме это решается так:
1) Открываю командную строку Visual Studio 2017
2) Прописываю нужную команду для компиляции файла, например, так: CL /EHsc "D:\Hello.cpp"
3) В результате получаю нужный мне исполнимый файл: Hello.exe
(смотрите рисунок)

Хочу всё это сделать автоматически в консольном приложении С++.
Умею по крайней мере пятью способами открыть командную строку Visual Studio 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
27
28
29
#include <windows.h>
#include <Shellapi.h>
#include <process.h>
#include <iostream>
 
using namespace std;
int main()
{
//первый способ
    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);  
 
//второй способ
WinExec("\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Common7\\Tools\\VsDevCmd.bat\"", SW_SHOWNORMAL);
 
//третий способ 
system("start /D \"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Common7\\Tools\\\" VsDevCmd.bat");
 
//четвёртый способ
ShellExecuteA(NULL, NULL, "\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Common7\\Tools\\VsDevCmd.bat\"", NULL, NULL, SW_RESTORE); 
 
//пятый способ
spawnl(P_WAIT, "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Common7\\Tools\\VsDevCmd.bat", "...", NULL);
 
 
return 0;
}
Но ни в одном из способов никак не могу прописать параметры: CL /EHsc "D:\Hello.cpp"
чтобы при открытии командной строки автоматически компилировался файл Hello.cpp

Может подскажете как это сделать?
Миниатюры
Как передать параметры компилятору?  
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.08.2018, 17:07
Ответы с готовыми решениями:

передать ссылки как параметры
народ объясните для чего они нужны,ссылки как параметры,или же указатели,в книге прочел не дошло если у кого есть книга С++ за 21 день то...

Как передать параметры в main ?
нужно передать параметры с командной строки в основную функцию. например я хочу найти cos(x). как задать и передать значение параметра X...

Как передать параметры через ShellExecute - C++
Приветствую Как передать строку и число через ShellExecute? SHELLEXECUTEINFO ShExecInfo = { 0 }; ShExecInfo.cbSize =...

9
 Аватар для LVV
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
22.08.2018, 10:47  [ТС]
"А ларчик просто открывался..."
Пересмотрел десятки руководств и нигде не нашел указаний о необходимости использовать значек &.

Вот так не работает:
Code
1
WinExec("[путь]"  cl /EHsc \"D:\\Hello.cpp\"", SW_SHOWNORMAL);
А так работает:
Code
1
WinExec("[путь]" & cl /EHsc \"D:\\Hello.cpp\"", SW_SHOWNORMAL);
Тема закрыта.
0
 Аватар для COKPOWEHEU
4079 / 2677 / 432
Регистрация: 09.09.2017
Сообщений: 11,888
24.08.2018, 16:56
"значок" & указывает выполнить предыдущую команду в фоновом режиме, после чего уже в интерактивном можно запускать следующую:
Code
1
$ cmd1 &
запускает cmd1 в фоновом режиме и возвращает командную строку
Code
1
$ cmd1 & cmd2 & cmd3 &
запускает в фоновом режиме cmd1, cmd2 и cmd3 и возвращает командную строку
Code
1
$ cmd1 & cmd2
запускает cmd1 в фоновом режиме и cmd2 в интерактивном. Как будто после запуска cmd1 в фоне вернул командную строку и в нее тут же вписали cmd2
Можно попробовать вместо "значка" & использовать "значки" ;, &&, ||. Они управляют последовательным (вместо параллельного, описанного ранее) запуском программ в зависимости от кода возврата предыдущей команды. Их использование выглядит так:
Code
1
$ cmd1 ? cmd2
где ? - "значок"
; запускает cmd2 независимо от того, завершилась cmd1 корректно (код возврата 0) или с ошибкой (не 0)
&& запускает cmd2 только в случае корректного завершения (код возврата cmd1 равен 0)
|| запускает cmd2 только в случае ошибки (код возврата cmd1 не равен 0)
.
По идее, WinExec / system должны корректно отрабатывать любые спецсимволы, характерные для обычного интерпретатора командной строки, включая полный путь, перенаправление ввода-вывода, последовательность запуска и флаги команд. Проблема в том, что в windows эти команды не всегда ведут себя именно таким образом, и мне неизвестно как это исправить.
Было бы неплохо получить комментарий гуру о принципе их работы и правильном использовании.
2
 Аватар для LVV
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
25.08.2018, 15:09  [ТС]
И снова дурдом...
Имеется переменная типа std::string в которую записан путь атрибуты и прочее...
Например:
std::string s = ""C:\Program Files(x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat " & cl /EHsc "D:\\Hello.cpp"";

Как эту переменную можно использовать, например, в WinExec?
Никакие преобразования, типа s.c_str или (LPCSTR)s не срабатывают...

Вот так работает:
C++
1
WinExec("\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Common7\\Tools\\VsDevCmd.bat\" &cl /EHsc \"D:\\Hello.cpp\"",SW_SHOWNORMAL);
А так не работает:
C++
1
2
std::string s = "\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Common7\\Tools\\VsDevCmd.bat\" &cl /EHsc \"D:\\Hello.cpp\"";
WinExec(s.c_str, SW_SHOWNORMAL);
Пишет:
Ошибка C3867 "std::basic_string<char,std::char_traits <char>,std::allocator<char>>::c_str": нестандартный синтаксис; используйте "&", чтобы создать указатель на член

Иными словами как преобразовать std::string в LPCSTR для подстановки в WinExec или другую функцию запуска процесса?
(кроме c_str)
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
25.08.2018, 20:20
LVV,

C++
1
WinExec(s.c_str(), SW_SHOWNORMAL);
1
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
26.08.2018, 03:59
т.е. скобок у функции c_str() нет
1
 Аватар для LVV
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
26.08.2018, 10:25  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
т.е. скобок у функции c_str() нет
Блиииииин.
Вот это я затупил....

Всё работает.
Всем спасибо.


Но вот новая проблема.
Мне нужно сохранить откомпилированный (исполнимый) файл в определённую папку (директорию). Например, просто на диске D.

По умолчанию компилятор сохраняет ехе-файл в папке source текущей учетной записи.
В руководствах нашел, что можно переопределить место выходного файла параметром OUT
https://msdn.microsoft.com/ru-... 80k4a.aspx
https://msdn.microsoft.com/ru-... cy933.aspx


Исходя из синтаксиса командной строки
https://msdn.microsoft.com/ru-... ecb4h.aspx
куда только не пробовал пробовал тыкать этот самый /OUT но всё безуспешно.
Что я не так делаю опять?
C++
1
2
std::string s = "\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Common7\\Tools\\VsDevCmd.bat\" &cl /EHsc \"D:\\code.cpp\" /OUT:\"D:\\code.exe\"";
WinExec(s.c_str(),SW_HIDE);
C++
1
2
std::string s = "\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\Common7\\Tools\\VsDevCmd.bat\" &cl /EHsc \"D:\\code.cpp\" /LINC /OUT:\"D:\\code.exe\"";
WinExec(s.c_str(),SW_HIDE);
не работает...
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
26.08.2018, 13:07
LINK
1
 Аватар для LVV
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
26.08.2018, 14:34  [ТС]
Опять протупил я
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
27.08.2018, 15:05
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
По идее, WinExec / system должны корректно отрабатывать любые спецсимволы, характерные для обычного интерпретатора командной строки, включая полный путь, перенаправление ввода-вывода, последовательность запуска и флаги команд. Проблема в том, что в windows эти команды не всегда ведут себя именно таким образом, и мне неизвестно как это исправить
CMD.EXE - не bash, и обычно ждёт завершения консольных команд, разделённых &

Если ввести в командной строке CMD.EXE
Code
1
 time & time /t
CMD сначала спросит время, и только после ответа оператора напечает время по второй команде.
Исправляется это установкой обычного интерпретатора командной строки
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.08.2018, 15:05
Помогаю со студенческими работами здесь

Как в Dev C++ передать параметры командной строки
Мне необходимо данные брать из файла. Путь к файлу нужно передавать как параметр командной строки argv. Подскажите пожалуйста как это...

Как в функцию обработки сообщений передать параметры?
Как в функцию обработки сообщений типа void CMathematicsView::OnResultButton() передать параметры? Как и где написать прототип и...

Как передать параметры конструктора одного класса другому?
Скажите пожалуйста, как это должно работать? Как передать параметры конструктора одного класса другому? #include &lt;iostream&gt; ...

Передать параметры в функцию.
Всем привет! Не получается передать параметры из Delphi в библиотеку написанную на C++. Код программы: #define...

Передать параметры в main
Нужно передать два параметра типа double в исполняемы файл ./Lab_10_2k Ни как не получается передать два параметра. Вот код основной...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
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