В программировании на Си я думал, что объектный файл может быть успешно связан с файлом .so, если в файле .so есть все символы, которые были объявлены в заголовочном файле.
Предположим, у меня есть foo.c, bar.h и две библиотеки libbar.so.1 и libbar.so.2. Реализация libbar.so.1 и libbar.so.2 полностью отличается, но я думаю, что все в порядке, если они оба предлагают функции, объявленные в bar.h.
Я связал foo.o с libbar.so.1 и создал исполняемый файл: foo.bin. Этот исполняемый файл работал, когда libbar.so.1 находится в LD_LIBRARY_PATH. (Конечно, символическая ссылка сделана как libbar.so). Однако, когда я изменяю символическую ссылку на libbar.so.2, foo.bin не может работать и жаловался :
undefined symbol: _ZSt4cerr
libbar.so.1 - это библиотека, созданная на С ++, а libbar.so.2 - это библиотека, построенная на С. Я не понимаю, почему foo.bin нужны эти связанные с c ++ символы, значащие только в самой libbar.so.1, поскольку foo.bin построен на чистом коде c foo.c.