У меня есть статическая библиотека, которую я не контролирую и которая определяет символ 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
.