функция находится в одном из объектных файлов, но компоновщик не связывает их - PullRequest
0 голосов
/ 01 октября 2019

друзья, у меня есть вопрос по поводу ссылок. У меня проблема с привязкой проекта. У меня есть дерево файлов:

ffmpeg4.1_custom
    fftools 
         ffmpeg.o  
    libavfilter
         libavfilter.so.

make имеет только одну команду для завершения - это:

$ make -n
printf "LD\t%s\n" ffmpeg_g; gcc -Llibavcodec -Llibavdevice -Llibavfilter -Llibavformat -Llibavresample -Llibavutil -Llibpostproc -Llibswscale -Llibswresample -L/usr/local/lib  -Wl,--as-needed -Wl,-z,noexecstack -Wl,--warn-common -Wl,-rpath-link=libpostproc:libswresample:libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil:libavresample   -o ffmpeg_g fftools/ffmpeg_opt.o fftools/ffmpeg_filter.o fftools/ffmpeg_hw.o fftools/cmdutils.o fftools/ffmpeg.o  -lavdevice -lavfilter -lavformat -lavcodec -lavresample -lpostproc -lswresample -lswscale -lavutil  -lm -lxcb -lxcb-shape -lxcb-xfixes -lasound -lSDL2 -lsndio -lXv -lX11 -lXext -pthread -lm -lva -lm -lz -lssl -lcrypto -lvpx -lm -lvpx -lm -lvpx -lm -lvpx -lm -pthread -lm -llzma -lz -lfdk-aac -lopenjp2 -lx264 -lva -lm -lm -lm -lm -pthread -lva-drm -lva -lva-x11 -lva -lm -lva -lXv -lX11 -lXext -ldl  
printf "STRIP\t%s\n" ffmpeg; strip -o ffmpeg ffmpeg_g

Я проверяю свою функцию в ffmpeg.o:

$ nm fftools/ffmpeg.o | grep my_func
                 U my_func

Я проверяю то же самое в libavfilter.so:

$ nm libavfilter/libavfilter.so | grep my_func
00000000000b2f8e t my_func

Я запускаю полную команду, которая связывает эти 2 файла:

$ gcc -Llibavcodec -Llibavdevice -Llibavfilter -Llibavformat -Llibavresample -Llibavutil -Llibpostproc -Llibswscale -Llibswresample -L/usr/local/lib  -Wl,--as-needed -Wl,-z,noexecstack -Wl,--warn-common -Wl,-rpath-link=libpostproc:libswresample:libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil:libavresample   -o ffmpeg_g fftools/ffmpeg_opt.o fftools/ffmpeg_filter.o fftools/ffmpeg_hw.o fftools/cmdutils.o fftools/ffmpeg.o  -lavdevice -lavfilter -lavformat -lavcodec -lavresample -lpostproc -lswresample -lswscale -lavutil  -lm -lxcb -lxcb-shape -lxcb-xfixes -lasound -lSDL2 -lsndio -lXv -lX11 -lXext -pthread -lm -lva -lm -lz -lssl -lcrypto -lvpx -lm -lvpx -lm -lvpx -lm -lvpx -lm -pthread -lm -llzma -lz -lfdk-aac -lopenjp2 -lx264 -lva -lm -lm -lm -lm -pthread -lva-drm -lva -lva-x11 -lva -lm -lva -lXv -lX11 -lXext -ldl
fftools/ffmpeg.o: In function `configure_filtergraph':
ffmpeg.c:(.text+0x6892): undefined reference to `my_func'
collect2: error: ld returned 1 exit status

Если она играет какую-либо роль, прототип моей функции находится вavfilter.h, код находится в avfilter.c и используется в ffmpeg.c Что я делаю не так?

Linux Mint 19 gcc версия 7.4.0 (Ubuntu 7.4.0-1ubuntu1 ~ 18.04.1)

1 Ответ

2 голосов
/ 01 октября 2019

Вывод 'nm' указывает, что my_func является "локальным" для libavfilter.so - он помечен как 't'. Вы можете ссылаться только на «глобальные» функции - они будут отмечены как 'T'

На странице руководства nm:

Тип символа. По крайней мере, используются следующие типы;другие также зависят от формата объектного файла. Если строчные буквы, символ обычно является локальным;в верхнем регистре символ является глобальным (внешним). Однако есть несколько строчных символов, которые показаны для специальных глобальных символов («u», «v» и «w»).

Доступ к локальным символам ограничен одним и тем же модулем.

...