Как решить проблемы с порядком работы библиотеки линкеров? - PullRequest
4 голосов
/ 23 ноября 2010

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

В любом случае нужно ли заставить GCC определить правильный порядок, или мне определить правильный порядок, не пытаясь каждыйвозможность?

mipsel-linux-gcc ffmpeg_mips_test.c -o ffmpeg_mips_test -Wall -v -I/ffmpegMIPS/includeffmpegMIPS/
                 -L/ffmpegMIPS/libffmpegMIPS/ -lavformat -lavcodec -lavutil -lswscale -lm -lpthread

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

[edit] Компиляция не удалась из-за неопределенных ссылок [/ edit]

Ответы [ 2 ]

8 голосов
/ 23 ноября 2010

У вас есть несколько опций

1) Вы можете добавить дополнительные вызовы в ваши библиотеки, которые имеют зависимости

2) Вы можете использовать опции --start-group / --end-group, например, так:

mipsel-linux-gcc ffmpeg_mips_test.c -o ffmpeg_mips_test -Wall -v -I/ffmpegMIPS/includeffmpegMIPS/
-L/ffmpegMIPS/libffmpegMIPS/ -Wl,--start-group -lavformat -lavcodec -lavutil -lswscale -Wl,--end-group -lm -lpthread

Здесь находится справочная запись ld, описывающая ее использование

В указанных архивах выполняется многократный поиск, пока не будут созданы новые неопределенные ссылки.Обычно поиск в архиве производится только один раз в порядке, указанном в командной строке.Если символ в этом архиве необходим для разрешения неопределенного символа, на который ссылается объект в архиве, который появляется позже в командной строке, компоновщик не сможет разрешить эту ссылку.Сгруппировав архивы, они все будут неоднократно обыскиваться, пока не будут разрешены все возможные ссылки.

2 голосов
/ 23 ноября 2010

Использование -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 в конце, но может делать разные вещи по мере необходимости в разных системах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...