У меня есть исходное дерево C ++, разработанное под Ubuntu 12.04 с использованием clang ++ 3.2, которое собирает некоторые библиотеки, затем компилирует некоторые приложения с этими библиотеками и обычную коллекцию других различных системных библиотек. Две загадки. Клиент сообщает, что код не может быть собран с неопределенной ссылкой на clock_gettime (). Конечно же, я не включил обязательный «-lrt» в логику сборки (scons).
Первая загадка: это компилирует, связывает и выполняет правильно и без жалоб в моей системе, даже если я не указываю «-lrt» в любом месте! Как правильно решить этот символ? Я подозреваю, что это потому, что приложение связывается с динамической библиотекой, которая сама требует librt, но я не понимаю логику, почему это происходит?
Вторая загадка: если удовлетворительное объяснение того, как clock_gettime () разрешается без «-lrt», почему это происходит в моей системе, а не в очень похожей настройке клиента?
«… загадка, окутанная тайной, внутри загадки» — Уинстон Черчилль
Предложения по инструментам, чтобы показать, что на самом деле здесь происходит, будут приветствоваться.
Из SUSv4 (Утилиты / c99):
-l rt
Эта опция должна сделать доступными все интерфейсы, указанные в <aio.h>
, <mqueue.h>
, <sched.h>
, <semaphore.h>
, а также <spawn.h>
интерфейсы помечены как необязательные в <sys/mman.h>
интерфейсы, помеченные как ADV (консультативная информация) в <fcntl.h>
и интерфейсы, начинающиеся с префикса clock_
а также time_
в <time.h>
, Реализация может искать эту библиотеку в отсутствие этой опции.
Я предполагаю, что вышесказанного достаточно, чтобы хотя бы объяснить, почему POSIX допускает такое поведение.
Скорее всего, задействованные системы отличаются в этом отношении. Например, clock_gettime()
может быть реализовано в libc
для тебя, но в librt
для вашего клиента. Не рискуйте: используйте портативный -l rt
и забудь о проблеме.
Более очевидный пример -l xnet
, который ведет себя аналогично в соответствии с POSIX, но, по крайней мере в системах Gentoo, Debian и Ubuntu Linux, компилируется с -l xnet
на самом деле выдает ошибку. (libxnet
предположительно содержит реализацию для интерфейса сокетов UNIX.)
Если вы хотите продолжить расследование проблемы, попробуйте ldd
в системах GNU / Linux. ldd
должен отображать динамические зависимости для вашего двоичного файла. Держу пари, что clock_gettime()
просто реализуется в libc.so
,
Других решений пока нет …