Вопрос

Предположим, у меня есть три C статические библиотеки говорят libColor.a который зависит от * libRGB.* a, который, в свою очередь, зависит от libPixel.a .Библиотека libColor.a говорят, что зависит от библиотеки libRGB.a поскольку есть некоторые ссылки в libColor.a к некоторым символам, определенным в libRGB.a.Как мне объединить все вышеперечисленные библиотеки в новую libNewColor.a который является независимым?

Независимый означает, что в новой библиотеке должны быть определены все символы.Поэтому при связывании мне просто нужно дать -Новый цвет.Размер новой библиотеки должен быть минимальным, т. е. она не должна содержать никаких символов в libRGB.a который не используется libColor.a и т.д.Я попытал счастья, используя различные варианты в ar команда (используется для создания и обновления статических библиотек / архивов).

Это было полезно?

Решение

1/ Извлеките ВСЕ объектные файлы из каждой библиотеки (используя ar) и попробуйте скомпилировать свой код без библиотек или каких-либо объектных файлов.Вероятно, вы получите абсолютное количество неопределенных символов.Если вы не получили неопределенных символов, перейдите к шагу 5.

2/ Возьмите первый и выясните, какой объектный файл удовлетворяет этому символу (используя nm).

3/ Запишите этот объектный файл, затем скомпилируйте свой код, включая новый объектный файл.Вы получите новый список неопределенных символов или, если таковых нет, перейдите к шагу 5.

4/ Перейдите к шагу 2.

5/ Объедините все объектные файлы в вашем списке (если таковые имеются) в единую библиотеку (опять же с ar).

Бах!Вот оно, у вас есть.Попробуйте связать свой код без каких-либо объектов, но с новая библиотека.

Все это можно было бы относительно легко автоматизировать с помощью сценария оболочки.

Другие советы

Мало используемой функцией архиватора GNU является архивный скрипт, это простой, но мощный интерфейс, и он может делать именно то, что вы хотите, например, если вызывается следующий скрипт script.ar:

CREATE libNewColor.a
ADDLIB libColor.a
ADDLIB libRGB.a
ADDLIB libPixel.a
SAVE
END

Затем вы могли бы вызвать ar следующим образом:

ar -M < script.ar

и вы получили бы libNewColor.a, который содержит все файлы .o из libColor.a libRGB.a и libPixel.a.

Кроме того, вы также можете добавлять обычные файлы .o с помощью команды ADDMOD:

CREATE libNewColor.a
ADDLIB libColor.a
ADDLIB libRGB.a
ADDLIB libPixel.a
ADDMOD someRandomCompiledFile.o
SAVE
END

Кроме того, сгенерировать эти скрипты в Makefiles очень просто, поэтому я обычно создаю несколько общее правило makefile для создания архивов, которое фактически генерирует скрипт и вызывает ar в скрипте.Что- то вроде этого:

$(OUTARC): $(OBJECTS)
    $(SILENT)echo "CREATE $@" > $(ODIR)/$(ARSCRIPT)
    $(SILENT)for a in $(ARCHIVES); do (echo "ADDLIB $$a" >> $(ODIR)/$(ARSCRIPT)); done
    $(SILENT)echo "ADDMOD $(OBJECTS)" >> $(ODIR)/$(ARSCRIPT)
    $(SILENT)echo "SAVE" >> $(ODIR)/$(ARSCRIPT)
    $(SILENT)echo "END" >> $(ODIR)/$(ARSCRIPT)
    $(SILENT)$(AR) -M < $(ODIR)/$(ARSCRIPT)

Хотя теперь, когда я смотрю на это, я предполагаю, что это не сработает, если $ (OBJECTS) пуст (т.е.если вы просто хотите объединить архивы без добавления дополнительных объектных файлов), но я оставлю это в качестве упражнения для читателя, чтобы при необходимости устранить эту проблему...:D

Вот документы для этой функции:

https://sourceware.org/binutils/docs/binutils/ar-scripts.html#ar-scripts

Статическая библиотека - это не намного больше, чем архив некоторых объектных файлов (.o).Что вы можете сделать, это извлечь все объекты из двух библиотек (используя "ar x"), а затем использовать "ar", чтобы связать их вместе в новой библиотеке.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top