При разработке проекта моей команды мы генерируем библиотеку Shared Object для нашего приложения из всех наших .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
, поэтому я предполагаю, что она не может иметь всеобъектные файлы.Я чувствую, что это то, что я, вероятно, делаю небольшую ошибку.У кого-нибудь есть совет?Заранее спасибо.