Объединить файлы С++ в один исходный файл

У меня есть проект c++ с несколькими исходными файлами и несколькими заголовочными файлами. Я хочу представить свой проект на конкурс программирования, для которого требуется один исходный файл. Существует ли автоматизированный способ свертывания всех файлов в один файл .cpp?

Например, если у меня есть a.cpp, ah, b.cpp, bh и т.д., Я хочу получить main.cpp, который успешно скомпилируется и запустится. Если бы я сделал это вручную, мог бы я просто объединить файлы заголовков и добавить исходные файлы друг к другу? Есть ли ошибки с внешними элементами, включающими зависимости и предварительные объявления?

Ответ 1

Я также нуждался в этом для соревнования по кодированию. Кодировка должна быть точной. Поэтому я написал быстрый скрипт JavaScript, чтобы добиться цели. Вы можете найти это здесь:   https://www.npmjs.com/package/codingame-cpp-merge

Я использовал его в 1 живом конкурсе и одной оффлайн-игре, и он никогда не давал плохих результатов. Не стесняйтесь предлагать изменения или делать запросы на это на github!

Ответ 2

Я не знаю инструмента, который объединяет файлы .cpp вместе, но я бы просто заархивировал все файлы вместе и отправил их в виде файла gzip.

Ответ 3

В общем, вы не можете этого сделать. Хотя вы можете с радостью вставить содержимое файлов заголовков в места расположения соответствующих #include s, вы не можете, в общем, просто конкатенировать исходные файлы. Во-первых, вы можете столкнуться с именованием конфликтов между вещами с файловой областью. И учитывая, что вы будете иметь скопированные файлы заголовков (с определениями классов и т.д.) В каждый исходный файл, вы получите классы, определенные несколько раз.

Есть гораздо лучшие решения. Как уже упоминалось, почему бы просто не застегнуть весь каталог проекта (после того, как вы очистили файлы с автогенерированными объектами и т.д.)? И если у вас действительно есть один исходный файл, просто напишите один исходный файл!

Ответ 4

Хорошо, это возможно, я видел, что многие исходные файлы объединяют файлы в одиночные .h и .c/.cpp, такие как sqlite

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

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

вот несколько примеров

gcclib source pack tool

Ответ 5

Утилита CIL может сделать это:

$TIGRESS_HOME/cilly --merge -c x1.c -o x1.o
$TIGRESS_HOME/cilly --merge -c x2.c -o x2.o
$TIGRESS_HOME/cilly --merge -c x3.c -o x4.o
$TIGRESS_HOME/cilly --merge  --keepmerged x1.o x2.o x3.o -o merged --mergedout=merged.c

Пример использования взят из здесь. Прочитайте документацию о CIL и ее недостатках здесь. Бинарное распределение для Mac OS X и Linux предоставляется с Tigress.

Ответ 6

Я думаю, что проект с заголовками, исходными файлами должен быть лучше, чем тот, у которого есть только один основной файл. Не только легче работать и читать, но также они знают, что вы хорошо работаете над разделением программных модулей.

Из-за вашего решения я предоставляю этот формат, и я думаю, что вам нужно делать ручную работу:

// STL headers


// --- prototype
// monster.h

// prince.h

// --- implementation

int main() { 
// your main function
return 0;
}

Ответ 7

Если вы решите отправить отдельный файл, а не сжатый архив, такой как tarball или zip файл, возможно, вам стоит рассмотреть несколько вещей.

Сначала соедините файлы вместе, как уже упоминал Томас Мэтьюз. С помощью нескольких изменений вы можете скомпилировать один файл. Удалите несуществующие операторы #include, такие как заголовки, которые теперь включены.

Вам также придется объединить эти файлы в их соответствующий порядок зависимостей. То есть, если a.cpp нуждается в классе, объявленном в b.hpp, то вам, скорее всего, понадобится объединить в списке Томаса Мэтьюза.

Считая, что лучший способ обмена кодом - это публичный репозиторий, например GitHub.com или сжато archive.

Ответ 8

Возможно, вы можете использовать github. Это система версий, и вы делитесь этим кодом таким образом. Таким образом, ваш код будет по-прежнему организован (заголовки и источник), что упростит чтение для всех (включая человека, с которым вы его делитесь).

Изменить. Это печально, что он не может выполнять простую задачу, такую ​​как загрузка файлов. Я не знаю инструментов, которые могут объединять файлы, как вы хотите, но вы можете взглянуть на CodeSmith Studio. Это немного кривая обучения, но она может быть весьма эффективной при правильном использовании.