Для фона я создаю некоторое программное обеспечение на 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
?
Мне кажется, что вся ваша проблема возникает из-за того, что явным образом не перечисляю, какие файлы попадают в что. Я рекомендую использовать autotools, CMake, простой старый Makefile или даже скрипт оболочки. Но используйте что-то. –
В настоящее время я использую скрипт оболочки, который явно не перечисляет (большинство) файлов; проблема в том, что плагины взаимозаменяемы, но все они встроены в один и тот же каталог с основным исполняемым файлом, поэтому в конечном итоге я получаю несколько дополнительных объектов в разделяемых библиотеках, если я не использую зависимости. – Techwolf