В соответствии с тем, как разрабатывается проект моей команды, мы генерируем библиотеку общих объектов для нашего приложения из всех наших .o
объектных файлов. Моя задача (надеюсь, она достаточно конкретна, но также достаточно общая, чтобы быть полезной другим!) - связать только те объектные файлы, которые изменились с момента последнего создания исполняемого файла. Например, вот командная строка, которую я использую для создания .so:
g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o -o libMySharedLibrary.so
Что работает, как ожидалось! :) Моя цель - иметь возможность связывать с этого момента только измененные объектные файлы, чтобы ускорить параллельный процесс связывания. Пример команды:
g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o -o libMySharedLibrary.so
Это обновит libMySharedLibrary.so
новыми объектными файлами, сохранив при этом старые объектные файлы в libMySharedLibrary.so
. На самом деле, когда я генерирую libMySharedLibrary.so
, используя указанную выше команду, размер файла намного меньше, чем при включении всех объектных файлов, поэтому я почти уверен, что указанная выше команда не выполняет то, что я хочу.
В ходе своих исследований я обнаружил, что существует опция -i
для компоновщика, аналогичная опции -r
, которая, похоже, просто объединяет все объектные файлы в один большой объектный файл. К сожалению, похоже, что это не то, что я хочу.
Короче говоря, я хотел бы связать только измененные объектные файлы после начальной ссылки, что приведет к более быстрому процессу связывания для будущих ссылок. Есть ли способ сделать это?
РЕДАКТИРОВАТЬ: пример того, что я пробовал с -i/-r
:
Пример команды: g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o -o AllMyObjects.o
Мне пришлось добавить тег -nostdlib
, чтобы он не кричал на меня о том, что он мне нужен, и удалил -shared
, потому что общие объекты не допускаются с помощью тега -r
.
Похоже, эта команда помещает все мои файлы .o в один большой файл .o. Так что, если бы я мог просто обновить этот файл .o отсюда, используя только измененные файлы .o, это было бы здорово. После того, как AllMyObjects.o был первоначально создан, я попробовал эту команду: g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o -o AllMyObjects.o
, но она также создала бы гораздо меньший (по размеру файла) AllMyObjects.o
, поэтому я предполагаю, что у него не может быть всех объектных файлов. Я чувствую, что это то, в чем я, вероятно, допускаю небольшую ошибку. У кого-нибудь есть совет? Заранее спасибо.
-static
: stackoverflow.com/questions/29391965/ Возможно, нам следует изменить заголовок этого вопроса, чтобы указать общие объекты. - person Ciro Santilli 新疆再教育营六四事件ۍ   schedule 28.12.2018