2015-08-16 3 views
1

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

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

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

Я просмотрел параметры компоновщика --as-needed, --gc-sections и --no-undefined, но я не смог собрать вместе процесс сборки.

Пример: Для получения исходных файлов main.cpp, a.cpp, b.cpp, a.h и b.h, где main.cpp и a.cpp оба включают b.h:

gcc -fPIC -c *.cpp -I. строит объектные файлы main.o, a.o и b.o.

gcc -o main.out *.o создает окончательный исполняемый файл main.out из файлов объектов ... включая a.o, который не используется. (--gc-sections это исправить.)

gcc -fPIC -shared -o a.so a.o -Wl,--as-needed !(a).o строит окончательный разделяемую библиотеку a.so из всех объектных файлов ... включая main.o, который не используется. Как предотвратить включение main.o в a.so?

+1

Мне кажется, что вся ваша проблема возникает из-за того, что явным образом не перечисляю, какие файлы попадают в что. Я рекомендую использовать autotools, CMake, простой старый Makefile или даже скрипт оболочки. Но используйте что-то. –

+0

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

ответ

1

Есть ли способ предоставить компоновщику основной файл объекта и создать общую библиотеку, содержащую только объекты, от которых она зависит?

Да: пакет всех объектов в библиотеку архива liball.a, затем связать так:

gcc -shared -o a.so a.o liball.a 

Компоновщика затем вытащить из liball.a всех объектов, которые a.o зависят от и только этих объекты , как объяснено here.

Примечание: liball.a может содержать a.o, нет вреда (как поясняет ссылка выше).

Update:

Есть ли способ сделать это без необходимости создания архива первого?

Я не знаю ни одного портативного способа сделать это.Gold linker имеет --start-lib и --end-lib флаги командной строки, которые achieve exactly that.

+0

Это похоже на то, что я хотел; моя цель состояла в том, чтобы создать общую библиотеку, содержащую «a.o» и ее зависимости (извините, это было немного неясно). Есть ли способ сделать это, не создавая сначала архив? – Techwolf

Смежные вопросы