Связывание библиотек с помощью gcc: порядок аргументов - PullRequest
14 голосов
/ 19 октября 2011

Как только я обновил свой дистрибутив Ubuntu до 11.10, я начал видеть странное поведение компоновщика с gcc. Я смог решить проблему, переместив мои -l аргументы в конец команды gcc (моя проблема была аналогична описанной в этой теме , и предложенное решение сработало для меня ... спасибо!).

Мой вопрос ... почему у меня эта проблема только сейчас? Я некоторое время разрабатывал и тестировал этот код на OS X и Ubuntu: я никогда не знал, что команды -l должны идти после ваших файлов .c, но даже в этом случае у меня никогда не возникало проблем. Я предполагаю, что это больше связано с версией GCC, чем с релизной версией Ubuntu.

Эта новая версия просто обеспечивает более строгое соблюдение этого требования, чем более ранние версии?

1 Ответ

2 голосов
/ 11 июня 2018

Для gcc, но также для других компиляторов (например, clang) порядок аргументов команды компоновщика имеет значение.Как правило, при составлении команды компоновщика я бы использовал следующий порядок:

  1. Объектные файлы (* .o)
  2. Статические библиотеки (* .a)
  3. Общие библиотеки (* .so)

Порядок общих библиотек также имеет значение.Если libfoo.so зависит от libbar.so, вы должны перечислить -lfoo перед -lbar.

Это может быть довольно сложно, если вы не знаете точных зависимостей.Следующая команда на linux может помочь:

ldd /path/to/libfoo.so

Здесь перечислены все общие библиотеки, от которых зависит libfoo.so.

Что касается вашего вопроса, почему эта проблема возникла в вашей конкретной версии gcc,Трудно сказать, не зная, какие библиотеки требует ваше приложение.Но если вы примените порядок, как я описал выше, он должен работать как для более старых, так и для более новых версий gcc.

Подсказка: CMake, если используется правильно, может обработать все эти вещи зависимости для вас ...

...