Проблема касается компиляции исполняемого файла, связанного с набором библиотек.Для примера возьмем следующие имена: exec_pgm -> lib_dep1 -> lib_dep2 -> lib_dep3 .
exec_pgm использует функции lib_dep1 , которые используют функции lib_dep2 и так далее.Это все динамические библиотеки (.so).Каждый бинарный файл имеет свой Makefile.В случае lib_dep3 я не указывал зависимость от librt (опущен -lrt).На моем компьютере я могу без ошибок или предупреждений скомпилировать три библиотеки и исполняемый файл.С другой стороны, на рабочей станции коллеги библиотеки правильно компилируются, но исполняемый файл генерирует ошибки типа
'lib_dep3.so: неопределенная ссылка на «shm_unlink»'.
Первый вопрос, почему компилятор не генерирует ошибку при сборке lib_dep3 , тогда как я не указываю соединение с librt?
Во-вторых, какВы получаете разницу между двумя рабочими станциями, внешне похожими?Действительно, у нас обоих есть Ubuntu 18.04 с gcc v7.4.0 (7.4.0 (Ubuntu 7.4.0-1ubuntu1 ~ 18.04.1)).
Вот командные строки, сгенерированные Makefile:
-> Компиляция
"gcc" -fmessage-length = 0 -fsigned-char -функция-секции -fdata-секции -Wall -Wextra -DVERSION = 0.1.0 -DREVISION = 51 -D_DEBUG -ansi -pedantic -std = gnu11 -fPIC -ggdb -Og -Isrc -Iinclude -o build / Debug_x86_64 / src / arguments.o -c src / arguments.c;
-> связывание
"g ++" -o build / Debug_x86_64 / lib_dep3.so.0.1.0 build / Debug_x86_64 / src / arguments.o build / Debug_x86_64 / src / file.o build / Debug_x86_64 / src / list.o build / Debug_x86_64 / src/mem.o -fmessage-length = 0 -fsigned-char -ffunction-section -fdata-section -Wall -Wextra -Xlinker --gc-section -Wl, -Map, "log / lib_dep3-0.1.0.map"-L / usr / local / lib -fPIC -shared -Wl, -soname, lib_dep3.so.0
Если я добавлю параметр -lrt к связыванию, ошибка исчезнет.