Как создать object файл для gcc

Обновлено: 07.07.2024

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

В последние несколько дней я пытался создать общую библиотеку. У меня также есть заголовочные файлы, исходные файлы и asm-файлы. Я попытался ответить на ряд подобных вопросов, но не смог найти ни одного, который указывал бы шаги, необходимые для создания файла .so из нескольких исходных.

Новичок в использовании autoconf и automake , я следую этому , чтобы изучить их. У меня есть вопрос относительно файла Makefile.am . Для простой программы helloworld ниже Makefile.am работает: AUTOMAKE_OPTIONS = foreign bin_PROGRAMS = helloworld helloworld_SOURCES = hello.c Как указать несколько.

Уже упоминалось архиве , но другим вариантом является единство строит .

Создайте отдельный "unity file"

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

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

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

Так эффективно вы объединили file1.cpp и file2.cpp в mylib.a .

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

Что такое целевой объектный файл, созданный после выполнения make в каталоге исходных файлов? Я попытался сделать из каталога, содержащего .c файлов для stress-ng. Я не видел никакого целевого объектного файла для создания. / target Как я могу выполнить стресс-НГ?

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

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

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

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

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

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

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

Это означает, что вы можете просто бежать

Обратите внимание, что -x сообщает компилятору, какой язык является входным, обычно он угадывает на основе вызываемого компилятора ( gcc vs g++ или аналогичного) и имени файла, но поскольку имя файла равно - , мы должны указать.

При этом, предполагая, что вы включаете весь свой проект, -fwhole-program в gcc -это хороший способ уменьшить размер генерируемого вывода, обратите внимание, что для этого Вам также нужно перечислить все необходимые библиотеки.

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

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

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

gcc Filename.c -о NewFilename.out

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

Похожие вопросы:

В настоящее время я работаю над гибким фреймворком сборки C/C++, который (надеюсь) довольно скоро открою с открытым исходным кодом. (см. этот вопрос для получения некоторой предыстории). Я использую.

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

Я создал несколько полезных функций утилиты в C, которые я хочу использовать в своих программах. Все они находятся в папке .. / lib. У меня есть заголовочный файл, содержащий прототипы функций.

В последние несколько дней я пытался создать общую библиотеку. У меня также есть заголовочные файлы, исходные файлы и asm-файлы. Я попытался ответить на ряд подобных вопросов, но не смог найти ни.

Новичок в использовании autoconf и automake , я следую этому , чтобы изучить их. У меня есть вопрос относительно файла Makefile.am . Для простой программы helloworld ниже Makefile.am работает.

Кто-нибудь знает, как использовать gcc для генерации всех возможных двоичных файлов из объектных файлов ? Я знаю, что вы можете использовать : gcc -MM для генерации всех файлов .o для некоторых.

Что такое целевой объектный файл, созданный после выполнения make в каталоге исходных файлов? Я попытался сделать из каталога, содержащего .c файлов для stress-ng. Я не видел никакого целевого.

У меня есть два исходных файла, которые я сейчас компилирую в один исполняемый файл. Я использую gcc -o ProgramName file1.c file2.c Я знаю, что gdb требует флага -g при компиляции, но я, должно.

Я работаю над тестом для GCC init_priority и MSC init_seg . Я хочу создать тест для компиляции и связывания двух исходных файлов в определенном порядке. У меня возникли проблемы с поиском информации.

GСС - это свободно доступный оптимизирующий компилятор для языков C, C++.

Программа gcc, запускаемая из командной строки, представяляет собой надстройку над группой компиляторов. В зависимости от расширений имен файлов, передаваемых в качестве параметров, и дополнительных опций, gcc запускает необходимые препроцессоры, компиляторы, линкеры.

Файлы с расширением .cc или .C рассматриваются, как файлы на языке C++, файлы с расширением .c как программы на языке C, а файлы c расширением .o считаются объектными.

Чтобы откомпилировать исходный код C++, находящийся в файле F.cc, и создать объектный файл F.o, необходимо выполнить команду:

Опция –c означает «только компиляция».

Чтобы скомпоновать один или несколько объектных файлов, полученных из исходного кода - F1.o, F2.o, . - в единый исполняемый файл F, необходимо ввести команду:

Опция -o задает имя исполняемого файла.

Можно совместить два этапа обработки - компиляцию и компоновку - в один общий этап с помощью команды:

<compile-and-link –options> - возможные дополнительные опции компиляции и компоновки. Опция –lg++ указывает на необходимость подключить стандартную библиотеку языка С++, <other-libraries> - возможные дополнительные библиотеки.
После компоновки будет создан исполняемый файл F, который можно запустить с помощью команды

<arguments> - список аргументов командной строки Вашей программы.
В процессе компоновки очень часто приходится использовать библиотеки. Библиотекой называют набор объектных файлов, сгруппированных в единый файл и проиндексированных. Когда команда компоновки обнаруживает некоторую библиотеку в списке объектных файлов для компоновки, она проверяет, содержат ли уже скомпонованные объектные файлы вызовы для функций, определенных в одном из файлов библиотек. Если такие функции найдены, соответствующие вызовы связываются с кодом объектного файла из библиотеки. Библиотеки могут быть подключены с помощью опции вида -lname . В этом случае в стандартных каталогах, таких как /lib , /usr/lib, /usr/local/lib будет проведен поиск библиотеки в файле с именем libname.a. Библиотеки должны быть перечислены после исходных или объектных файлов, содержащих вызовы к соответствующим функциям.

Опции компиляции

Среди множества опций компиляции и компоновки наиболее часто употребляются следующие:

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

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

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

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

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

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

так эффективно вы совместили 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-->

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

ОТВЕТЫ

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

Таким образом, вы эффективно комбинировали 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

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

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

Читайте также: