【问题标题】:function is in one of object files but linker doesn't link them函数位于目标文件之一中,但链接器未链接它们
【发布时间】: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


【解决方案1】:

'nm' 输出表明 my_func 是 libavfilter.so 的“本地” - 它被标记为 't'。您只能引用“全局”函数 - 这些函数将标有“T”

来自 nm 手册页:

符号类型。至少使用以下类型;其他的也取决于目标文件 格式。如果是小写,符号通常是本地的;如果是大写,则符号是全局的(外部的)。那里 然而,一些小写符号显示为特殊的全局符号(“u”、“v”和“w”)。

对本地符号的访问仅限于同一模块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 2014-02-13
    • 2016-07-04
    • 1970-01-01
    相关资源
    最近更新 更多