Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
9 / 7 / 1
Регистрация: 05.04.2012
Сообщений: 150

Компиляция "на лету"

03.10.2015, 23:56. Показов 1783. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дабы опустить подробности опишу только саму проблему:


C++
1
2
3
4
5
6
7
8
9
//path = /var/www/data
//compile_id = 1
//which g++ выдал именно этот путь
//полный путь к файлу /var/www/data/tasks/1/prog.cpp
 
ostringstream compile_args;
compile_args << path << "/tasks/" << compile_id << "/prog.cpp";
 
execl("/usr/bin/g++", compile_args.str().c_str(), NULL);
достоверно известно что файл там лежит.

на выхлопе получаю:

C++
1
prog.cpp: fatal error: no input files
Что я делаю не так?

если вручную ввести:

C++
1
/usr/bin/g++ /var/www/data/tasks/1/prog.cpp
то ошибки не возникает
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.10.2015, 23:56
Ответы с готовыми решениями:

Компиляция на лету
Я знаю, что в System.Reflection.Emit есть классы для компиляции C# кода и т.д., но в MSDN ни слова!!! как это чудо юзать?

Компиляция regex на лету
Есть строки Для поиска нужной строки пользователь вводит 5*B Далее код: string first = param.RemoveRightPart(&quot;*&quot;); ...

Компиляция препроцессоров на лету
Можно ли less либо saas компилировать на лету? Если подключить пустой файл css к странице, а код писать в препроцессорном файле, из...

6
1265 / 979 / 384
Регистрация: 02.09.2012
Сообщений: 3,026
04.10.2015, 01:12
Лучший ответ Сообщение было отмечено KFan как решение

Решение

по моему вы execl не правильно вызываете...
посмотрите man
по идее должно быть так
C++
1
execl("/usr/bin/g++", "g++", compile_args.str().c_str(), NULL);
1
9 / 7 / 1
Регистрация: 05.04.2012
Сообщений: 150
04.10.2015, 15:36  [ТС]
Отлично, огромное спасибо, проблема решена, долго над ней сидел.

Добавлено через 5 часов 4 минуты
К сожалению рано порадовался, не принимаются дополнительные параметры:

C++
1
2
3
4
5
6
7
    string args = compile_item.lang.args;
    int pos_file;
    while ((pos_file = args.find("#FILE#", 0)) != string::npos) {
        args.replace(pos_file, 6, task_code_file.c_str());
    }
    
    execl(compile_item.lang.compile_path.c_str(), compile_item.lang.compile.c_str(), args.c_str(), NULL);
в args строка: "#FILE#" -o program
при выводе в консоль этой переменной получаю

C++
1
"/var/www/data/tasks/1/program.cpp" -o program
если использовать просто #FILE# без параметров и кавычек, программа собирается.

сама ошибка:
C++
1
2
g++: error: "/var/www/data/tasks/1/program.cpp" -o program: No such file or directory
g++: fatal error: no input files
Добавлено через 10 минут
Возможно если я правильно трактую то что вижу, каждый параметр надо передавать отдельным аргументом, иначе они сливаются в один?
0
1265 / 979 / 384
Регистрация: 02.09.2012
Сообщений: 3,026
04.10.2015, 16:39
да, каждый аргумент отдельным параметром функции execl
1
9 / 7 / 1
Регистрация: 05.04.2012
Сообщений: 150
04.10.2015, 18:35  [ТС]
Спасибо за вашу помощь, но вопросы еще не кончились

Переделал кусок кода:

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
        //args = #FILE#,-o program
    string args = compile_item.lang.args;
    int pos_file;
    while ((pos_file = args.find("#FILE#", 0)) != string::npos) {
        args.replace(pos_file, 6, task_code_file.c_str());
    }
 
    vector<const char*> _argv;
 
    _argv.push_back(compile_item.lang.compile.c_str());
    while ((pos_file = args.find(",", 0)) != string::npos) {
        string param = args.substr(0, pos_file);
        args = args.substr(pos_file + 1);
            
        write(STDOUT_FILENO, param.c_str(), strlen(param.c_str()));
        write(STDOUT_FILENO, "\n", 1);
            
        _argv.push_back(param.c_str());
    }
    _argv.push_back(NULL);
        
    if (strlen(args.c_str()) > 0) {
        write(STDOUT_FILENO, args.c_str(), strlen(args.c_str()));
        write(STDOUT_FILENO, "\n", 1);
        _argv.push_back(args.c_str());
    }
        
    execv(compile_item.lang.compile_path.c_str(), (char **) &_argv[0]);
собственно говоря компиляция работает, но на выхлопе я всегда получаю файл "a.out", хотя указал, что она должна называться "program".

Если передать "program" как отдельный параметр, либо убрать, тогда выдает ошибку, что после параметра "-o" не обнаружено название файла.

Соответственно можно сделать вывод, что параметр однозначно передается, но желаемого результата не наблюдается
0
1265 / 979 / 384
Регистрация: 02.09.2012
Сообщений: 3,026
05.10.2015, 02:18
Если я правильно понял код, то "-o program" у вас получается одним аргументом??!
Это не правильно, "-o" и "program" должны быть отдельными аргументами.
1
9 / 7 / 1
Регистрация: 05.04.2012
Сообщений: 150
05.10.2015, 09:33  [ТС]
Ну собственно говоря я пытался так, как и написал в выше указанном посте, я после работы попробую еще раз, возможно я что-то сделал не так.

Добавлено через 13 минут
Кажется я нашел ошибку, у меня NULL ставится перед последним параметром, а не после него. Но проверю только дома.

Добавлено через 1 час 18 минут
Да в этом и была ошибка, тема исчерпана, компиляция работает как надо.


Может кому пригодиться, методом проб и ошибок выяснить что -oprogram должны быть неразрывно передаваться одним аргументом, а не отдельными
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.10.2015, 09:33
Помогаю со студенческими работами здесь

Компиляция WinForms приложения на лету. Некомпилится, причина не понятна.
Вот пытаюсь откомпилировать WindowsForms приложение. Не компилируется, выдаёт ошибки: Количество ошибок: 2 Ошибка: Имя типа или...

[python2] Компиляция "на лету". Как сохранить байт-код в файл?
#!/usr/bin/env python2 text = '''\ def get42(): return 42 ''' code = compile(text, '&lt;string&gt;', 'exec') ns = {} exec...

Динамическая компиляция (компиляция программы в программе)
Привет форумчане, встретился с такой проблемой,мне в курсовой работе сказали сделать чтобы с textBox программа считывала введённый текст,...

Функции на лету
Доброго времени суток, можно ли в с++ делать функции на лету, к примеру код на шарпе: Func&lt;bool&gt; func = new Func&lt;bool&gt;(()...

Перевод на лету
Извените если не совсем туда тему поместил. предположим пользователь введит в форму данные на русском - а мне необходино сохранить их...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru