Как использовать несколько исходных файлов для создания одного объектного файла с gcc

Я использую параметр -c с g++ для создания кучи объектных файлов, и это позволяет мне указывать только один исходный файл для каждого объектного файла. Я хочу, чтобы несколько файлов попали в некоторые из них. Есть ли способ сделать это?

Ответ 1

Другие упомянули архив, но другой вариант Unity build.

Вместо:

g++ -c file1.cpp file2.cpp

Создайте отдельный "файл единства"

// This is the entire file (unity.cpp)
#include "file1.cpp"
#include "file2.cpp"
// more if you want...

Тогда

g++ -c unity.cpp

Это также имеет преимущество более быстрой компиляции и связывания во многих случаях (поскольку заголовки, используемые как file1.cpp, так и file2.cpp, анализируются только один раз). Однако, если вы помещаете слишком много файлов в одно единство, то вы обнаружите, что вам нужно перестроить больше источников, чем вы хотели, поэтому вам нужно попытаться найти баланс.

Ответ 2

Вы можете использовать ld -r для объединения объектов, сохраняя информацию о перемещении и оставляя конструкторы неразрешенными:

ld -r -o everything.o object1.o object2.o ...

Ответ 3

Вы можете создать archive, который представляет собой набор объектных файлов.

ar mylib.a file1.o file2.o

Таким образом, вы эффективно комбинировали file1.cpp и file2.cpp в mylib.a.

Ответ 4

Вы можете использовать команду ar для создания архива для использования вашей программой.

Ответ 5

Использование решения Peter Alexander является основным, что приходит на ум.

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

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

Ответ 6

Я знаю, что вы спрашиваете, как объединить файлы .cpp в один объектный файл. Я предполагаю, что ваша цель для этого - связать объединенный объект позже с другими отдельными объектными файлами. Если это так, вы можете использовать статическую или динамическую библиотеку. Для ваших целей я предлагаю динамическую библиотеку, так как вы можете сделать один шаг компиляции и ссылки, полностью пропуская генерации объектных файлов. Используя такую ​​команду, как g++ -shared -fpic file1.cpp file2.cpp file3.cpp -o libtest.so, вы можете комбинировать ваши .cpp файлы, которые нужно комбинировать в библиотеках. Для компиляции библиотеки (ов) с вашими отдельными объектными файлами используйте команду, например g++ -ltest individual1.o individual2.o individual3.o -o myexecutable. На этом заключительном этапе привязки я предполагаю, что libtest.so находится в вашем текущем каталоге. Если его нет в вашем текущем каталоге, добавьте флаг -L и находится каталог libtest.so.

Ответ 7

Единственное решение, о котором я знаю, это создать отдельный файл С++, который включает в себя все файлы, которые вы хотите скомпилировать, и скомпилировать их. На мой взгляд, неплохое решение; Как правило, вы хотите увеличить детализацию объектных файлов, а не уменьшать его.

Реальный вопрос, я полагаю, это то, чего вы пытаетесь достичь. Почему вам нужен только один объектный файл?

Ответ 8

Мы используем опцию -o для создания объектного файла... По умолчанию при компиляции файла с использованием gcc или g++ мы получаем объектный файл с именем a.out, но мы можем изменить его имя.... использовать следующее для компиляции файла

gcc Filename.c -o NewFilename.out

затем запустить файл, который вы можете использовать./NewFilename.out