У меня есть статическая библиотека, которую я не контролирую и которая определяет символ gettimeofday(). Основная функция должна использовать эту функцию, но я не хочу, чтобы она использовала функцию из библиотеки, я просто хочу, чтобы использовалась обычная функция из системы. Как сделать так, чтобы компоновщик предпочитал функцию из системных библиотек?
Я использую macOS и использую clang.
Вещи, которые я пробовал:
связывая библиотеку с -weak-l. Это не сработало. Я думал, что это приведет к тому, что «сильная» ссылка в системной библиотеке будет переопределять ссылку в статической библиотеке, но, видимо, этого не произошло. Может быть, значение слова «слабый» в macOS немного отличается от Linux?
изменение порядка командной строки компоновщика. Я попробовал поставить -lc перед статической библиотекой, но это не помогло. Я не совсем уверен, из какой библиотеки взят этот символ. Связанный вопрос: есть ли способ заставить ld сказать, из какой библиотеки он получил символ?
Я подумал о том, чтобы переименовать все символы в библиотеке, чтобы они имели какой-нибудь префикс, но llvm_objcopy, который, похоже, не поддерживает объекты Mach-O.
@jthill Хорошее нестандартное мышление!
@IanAbbott, спасибо, на его странице руководства написано: «Приложения должны использовать функцию clock_gettime() вместо устаревшей функции gettimeofday()», поэтому создается впечатление, что она все еще находится внутри коробки.
Это исправило бы проблему в данном конкретном случае, но есть несколько других функций, которым нет эквивалента.
Библиотека, которую вы пытаетесь использовать, очень усложняет жизнь. Используйте другую библиотеку или получите код и переименуйте определяемые им символы. Вас ждет мир боли, пока вы продолжаете его использовать.





Поскольку вы работаете на macOS, используйте -lSystem перед статической библиотекой, а не -lc.
В результате компоновщик выдаст предупреждение о том, что он «игнорирует повторяющиеся библиотеки: '-lSystem'». Если вы хотите избежать этого, вы можете использовать переключатель -v в Clang, чтобы он выводил используемую команду ссылки, а затем воспроизвести эту команду ссылки самостоятельно, опустив последующий -lSystem.
Это правильный ответ, спасибо!
Вместо этого используйте
clock_gettime.