Человек кусает собаку: символ разрешен * без * ссылки на библиотеку? clock_gettime () -lrt

У меня есть исходное дерево C ++, разработанное под Ubuntu 12.04 с использованием clang ++ 3.2, которое собирает некоторые библиотеки, затем компилирует некоторые приложения с этими библиотеками и обычную коллекцию других различных системных библиотек. Две загадки. Клиент сообщает, что код не может быть собран с неопределенной ссылкой на clock_gettime (). Конечно же, я не включил обязательный «-lrt» в логику сборки (scons).

Первая загадка: это компилирует, связывает и выполняет правильно и без жалоб в моей системе, даже если я не указываю «-lrt» в любом месте! Как правильно решить этот символ? Я подозреваю, что это потому, что приложение связывается с динамической библиотекой, которая сама требует librt, но я не понимаю логику, почему это происходит?

Вторая загадка: если удовлетворительное объяснение того, как clock_gettime () разрешается без «-lrt», почему это происходит в моей системе, а не в очень похожей настройке клиента?

«… загадка, окутанная тайной, внутри загадки» — Уинстон Черчилль

Предложения по инструментам, чтобы показать, что на самом деле здесь происходит, будут приветствоваться.

1

Решение

Из 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,

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]