Похоже, вы неправильно понимаете, как работают общие библиотеки. .So файл содержит определение, как и .o файл. Один для динамического связывания, а другой для статического связывания. Вы должны использовать один или другой, но не оба.
Скажите, например, с учетом вашей общей разделяемой библиотеки libcpld-cmd.so
, и вы хотите связать ее с вашим кодом, например, с источником main.c
, затем:
gcc main.c -lcpld-cmd.so -o myprogram
Компоновщик обработает cpld-cmd.so для разрешения символов, но на самом деле не будет связывать в нем объектный код - это будет статическая ссылка.
При запуске myprogram
библиотека должна быть доступна, и загрузчик ОС будет динамически связывать код библиотеки во время выполнения.
Ссылка: http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html
Если, с другой стороны, вы хотите статически связать, вы бы связали cpld-cmd.o
, а файл .so не играет роли и не требуется - весь код статически связан с myprogram
.
gcc main.c cpld-cmd.o -o myprogram