Объединить файлы С++ в один исходный файл
У меня есть проект 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. Это немного кривая обучения, но она может быть весьма эффективной при правильном использовании.