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

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

8 ответов


нет архиве, но другой вариант Unity строит.

вместо:

g++ -c file1.cpp file2.cpp

создайте отдельный "файл unity"

// 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 анализируются только один раз). Однако, если вы поместите слишком много файлов в одно целое, вы обнаружите, что вы нужно перестроить больше источников, чем вы хотели, поэтому вам нужно попытаться найти баланс.


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

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

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

ar mylib.a file1.o file2.o

так эффективно вы совместили file1.cpp и file2.cpp на mylib.a.


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


использование решения из Питер Александр Главная, что приходит на ум.

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

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


Я знаю, что вы спрашиваете о том, как совместить .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 в.


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

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


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

имя файла gcc.C-o новое имя.вон!--4-->

затем для запуска файла вы можете использовать ./NewFilename.вон!--1-->