Использование -lpthread
устарело. Вы должны использовать -pthread
, и gcc сгенерирует все опции и библиотеки, необходимые для поддержки pthread.
Что касается других, приведение их в правильный порядок - это просто вопрос понимания зависимостей между ними. Если A
зависит от B
, -lA
должно отображаться перед -lB
в командной строке. В вашем случае -lm
- это системная математическая библиотека (которая отделена от основного libc только по глупым унаследованным причинам) и не зависит ни от чего другого, поэтому она всегда должна находиться в конце командной строки. -lavutil
- это библиотека служебных функций, используемая ffmpeg
и включенными в нее библиотеками, поэтому она должна идти после всех других библиотек ffmpeg
. -lswscale
- это библиотека масштабирования изображений, которая может понадобиться другим библиотекам, поэтому я бы поставил ее после -lavformat
и -lavcodec
, но до -lavutil
, если ей нужны функции из -lavutil
.
Наконец, в мире ffmpeg
кодеки считаются основополагающими, а контейнеры - слоем поверх них (скорее противоположностью некоторым фреймворкам), поэтому -lavformat
зависит от -lavcodec
. Таким образом, окончательный порядок в вашем примере должен быть:
-lavformat -lavcodec -lswscale -lavutil -lm
И -pthread
могут идти в любом месте командной строки; это обычно приводит к тому, что gcc ставит скрытый -lpthread
в конце, но может делать разные вещи по мере необходимости в разных системах.