gpt4 book ai didi

c - 函数在目标文件之一中,但链接器不链接它们

转载 作者:太空宇宙 更新时间:2023-11-04 07:44:17 24 4
gpt4 key购买 nike

friend 们,我有一个关于链接的问题。我在链接项目时遇到问题。我有文件树:

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

如果它起到任何作用,我的函数原型(prototype)在avfilter.h 中,代码在avfilter.c 中,它在ffmpeg.c 中使用我做错了什么?

Linux 薄荷 19gcc 版本 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)

最佳答案

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

来自 nm 手册页:

The symbol type. At least the following types are used; others are, as well, depending on the object file format. If lowercase, the symbol is usually local; if uppercase, the symbol is global (external). There are however a few lowercase symbols that are shown for special global symbols ("u", "v" and "w").

对局部符号的访问仅限于同一个模块。

关于c - 函数在目标文件之一中,但链接器不链接它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58185775/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com