【发布时间】:2019-10-01 13:25:16
【问题描述】:
朋友们,我有一个关于链接的问题。我在链接项目时遇到问题。 我有文件树:
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
我运行链接这两个文件的完整命令:
$ 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)
【问题讨论】:
-
您确定与
libavfilter/libavfilter.so链接吗?也许用路径明确指定库(即将-lavfilter更改为libavfilter/libavfilter.so)? -
libavfilter.so 的 nm 输出中的“t”表示符号未导出(否则为“T”)。您需要确保它已导出,然后才能在外部使用(例如使用
__attribute__((visibility("default"))))。 -
@SanderDeDycker,我尝试这样做,不幸的是它不起作用。我尝试将它添加到 .h 和 .c 中,没有效果。
标签: c linker shared-libraries