У меня есть проект, состоящий из нескольких файлов С++. Мне нужно объединить все эти файлы в один файл main.cpp
и отправить один файл по сети. Получатель на другом конце скомпилирует и запустит файл:
gcc main.cpp
./a.out
Обратите внимание, что получателем на другом конце является программа, ожидающая только один файл и не изменяющая свои инструкции по компиляции.
Например: предположим, что у меня есть следующие 2 файла:
основной.cpp:
#include <iostream>
#include <vector>
#include <my_utils.hpp>
int main() {
std::vector<int> v = GetVector();
court << v.size() << endl;
return 0;
}
my_utils.hpp:
#pragma once
#include <vector>
std::vector<int> GetVector() {...}
void ProcessVector(const vector<int>& v) {...}
Вопрос: есть ли команда препроцессора, которая объединит эти два файла в один, чтобы получить следующее:
// merged.cpp
// the recipient can compile and run this file
#include <iostream>
#include <vector>
std::vector<int> GetVector() {...}
void ProcessVector(const vector<int>& v) {...}
int main() {
std::vector<int> v = GetVector();
cout << v.size() << endl;
return 0;
}
Стандартный препроцессор объединяет все, включая, например, большой объем кода, который содержит <vector>
. Я хочу объединить несколько файлов в один, который будет содержать только мои собственные определенные функции.
Необязательно: если я не использую ProcessVector
в своей основной программе, может ли препроцессор исключить эту функцию из окончательного объединенного файла?
Пожалуйста, добавьте некоторую справочную информацию к вопросу, почему вы хотите / должны объединить файлы.
@ Human-Compiler извините, это не нужно
@Bodo добавил объяснение моего сценария
Связано: Как запустить препроцессор только для локальных заголовков?
Если у вас возникли проблемы с ошибкой сборки, попробуйте создать минимальный воспроизводимый пример и вместо этого спросите нас об этом напрямую. Обычно это быстрее и проще.
@TedLyngmo, но команда cat
как есть также добавит все директивы #include <my_utils.hpp>
. У получателя не будет файла my_utils.hpp
на другом конце.
Ваш вариант использования выглядит странно. Почему бы вам не отправить TAR, ZIP или другой архив или не использовать сетевой протокол, который может отправлять несколько файлов? Что такое "получатель"? Программа? Персона?
@Bodo, да, получатель - это программа, она не читает ZIP и т. д. Она просто берет текстовый файл main.cpp
, компилирует его и запускает.
@mercury0114 mercury0114 А почему он устроен таким странным образом?
@Бодо, например. многие онлайн-конкурсы и платформы по кодированию работают таким образом: https://onlinejudge.org/
https://codingcompetitions.withgoogle.com/kickstart/
и т. д.
И вы хотите автоматически отправлять множество объединенных проектов на онлайн-конкурс по программированию? Возможным алгоритмом может быть создание списка всех файлов заголовков, которые являются частью вашего проекта, cat
всех файлов заголовков, за которыми следуют все исходные файлы, и удаление всех #include
строк, которые ссылаются на один из файлов заголовков проекта, например, с помощью grep
. Конечно, компиляция всего кода, объединенного в одну большую единицу компиляции, может дать результаты, отличные от компиляции модулей по отдельности. Вы даже можете получить ошибки, которых не было бы при обычной компиляции.
Я не знаю никаких методов препроцессора для этого, но есть и другие возможности. Я читал, что вы просто хотите отправить один компилируемый main.cpp
файл для онлайн-соревнований по программированию, вот с чем я работал.
Если у вас есть доступ к инструментам командной строки, вы можете просто использовать sed
. Если вы измените все свои локальные заголовки на #include "..."
, вы можете сделать:
sed '/#include ".*"/d' *.hpp *.cpp
Что это делает, так это печатает все строки, кроме строк, которые имеют от #include "..."
до stdout
. Все файлы .hpp
будут перед всеми файлами .cpp
, поэтому с прототипами не должно быть никаких сложностей. Затем вы можете просто перенаправить этот вывод в какой-либо файл.
Я собираюсь принять этот ответ. Похоже, что нет инструмента, который бы это делал, так что мне просто придется написать его самому.
Если вы используете Linux или аналогичную систему, вы можете использовать
cat file1 file2 > result
для объединения нескольких файлов в один. Какова цель этой операции?