ffmpeg: undefined reference to sws_getContext and others library linking question

ffmpeg: undefined reference to sws_getContext and others library linking questionn 编译和移植过程中遇到问题的资料总结

资料来源:

http://ffmpeg.org/pipermail/ffmpeg-user/2012-July/007945.html

https://blog.csdn.net/jody1989/article/details/46660369

https://blog.csdn.net/lg1259156776/article/details/53324177

Hi Everybody, 
(sorry for inconvenence: ffmpeg-user can't receive this big email, it limited in 60KB, I just want you to see full error message)
I compiled ffmpeg-0.11.1 on linux, I want to use its library and header in a small specific c program to use av_register_all() in ffmpeg library,
I am having trouble in linking ffmpeg.

0) I use Centos 6.3 for a linux machine.
1) I have compiled ffmpeg-0.11.1 in /root/ffmpeg-source/working/ffmpeg ( I use 'configure' and 'make', not use 'make install' because i want to manage ffmpeg in a specific directory)
 ./configure --enable-gpl --enable-avfilter --enable-swscale --disable-shared --enable-libmp3lame --enable-libtheora --enable-libvo-aacenc --enable-libvorbis --enable-libvpx --enable-libx264 --    enable-version3
make

2) I make a test.c in /root/ffmpeg-source/working/test.c as below:
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include
int main()
{
        avcodec_register_all();
        avfilter_register_all();
        av_register_all();
        printf("Test FFmpeg library! \n");
        return 1;
}

2.1) make a link inside working:
ln -s ../ffmpeg ffmpeg 
 
3) I make a Makefile in /root/ffmpeg-source/working/ as below:
PROGRAM = test
INCLUDEDIRS = -Iffmpeg/

LIBDIRS = \
        -L./ffmpeg/libavcodec \
        -L./ffmpeg/libavformat \
        -L./ffmpeg/libavfilter \
        -L./ffmpeg/libpostproc \
        -L./ffmpeg/libswresample \
        -L./ffmpeg/libswscale \
        -L./ffmpeg/libavdevice \
        -L./ffmpeg/libavutil

LIBS = -lpostproc -lswresample -lswscale -lavfilter -lavdevice -lavformat -lavcodec -lavutil -lm -ldl -Wl
 
CXXSOURCES = test.c               
CXXOBJECTS = $(CXXSOURCES:.c=.o)  
HEADERFLAGS = $(INCLUDEDIRS)
CXX = gcc
LDFLAGS = $(LIBDIRS) $(LIBS)

all: $(PROGRAM)
$(PROGRAM): $(CXXOBJECTS)
        $(CXX) -o $@ $(CXXOBJECTS) $(LDFLAGS)
test.o: test.c
        $(CXX) $(HEADERFLAGS) -c -o test.o test.c
clean:
        $(RM) -f $(CXXOBJECTS) $(PROGRAM)

=> When I compile:
[root at CENT6 working]# make
gcc -Iffmpeg/  -c -o test.o test.c
gcc -o test test.o   -L./ffmpeg/libavcodec -L./ffmpeg/libavformat -L./ffmpeg/libavfilter -L./ffmpeg/libpostproc -L./ffmpeg/libswresample -L./ffmpeg/libswscale -L./ffmpeg/libavdevice -L./ffmpeg/libavutil  -lpostproc -lswresample -lswscale -lavfilter -lavdevice -lavformat -lavcodec -lavutil -lm -ldl -Wl
./ffmpeg/libavfilter/libavfilter.a(vf_mp.o): In function `sws_getContextFromCmdLine':
/root/ffmpeg-source/ffmpeg/libavfilter/vf_mp.c:324: undefined reference to `sws_getContext'
./ffmpeg/libavfilter/libavfilter.a(vf_scale.o): In function `config_props':
........ 编译报错信息请参照原文,有完整的记录
collect2: ld returned 1 exit status
make: *** [test] Error 1


解决办法

转自     https://blog.csdn.net/jody1989/article/details/46660369

2) 错误提示:
/opt/.../lib/libavcodec.a(pthread.o): In function `avcodec_thread_free':
/opt/.../libavcodec/pthread.c:95: undefined reference to `pthread_join'
解决:
编译时加链接linux的多线程库 "-lpthread"
# gcc output_example.c -o output_example 
-I/opt/.../include 
-L/opt/.../lib  
-lavcodec -lavdevice -lavfilter -lavformat -lavutil -lswscale
-lm -lpthread

转自    https://blog.csdn.net/lg1259156776/article/details/53324177

后来查阅ffmpeg的 pkg-config,终于找到原因,错误导致过程让我痛苦,原因却很简单。

错误:gcc  test.c -o test -I/GA/gabin/include/ -L/GA/gabin/lib  -lavcodec -lavformat  -lavdevice -lavutil -pthread  -ldl -lswscale -lSDL -lbz2  -lasound -lz -lm  

调整: gcc  test.c -o test -I/GA/gabin/include/ -L/GA/gabin/lib  -lavformat  -lavdevice -lavcodec  -lavutil -pthread  -ldl -lswscale -lSDL -lbz2  -lasound -lz -lm  

问题解决,同志需要注意包依赖关系。

你可能感兴趣的:(linux)