首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

从编译ffmpeg/examples,紧接着了解pkg-config

2012-10-19 
从编译ffmpeg/examples,进而了解pkg-config在编译ffmpeg/doc/example的时候,发现该目录下只有一些.C文件和

从编译ffmpeg/examples,进而了解pkg-config
在编译ffmpeg/doc/example的时候,发现该目录下只有一些.C文件和makefile,于是,很自然的输入:make。
期待成功编译的结果,然而却报出了很多错误,主要错误如下:

Package lib* was not found in the pkg-config search path.Perhaps you should add the directory containing `lib*.pc'to the PKG_CONFIG_PATH environment variableNo package 'lib*' found


不得其解,于是打开makefiel文件:
# use pkg-config for getting CFLAGS and LDLIBSFFMPEG_LIBS=    libavdevice                        \                libavformat                        \                libavfilter                        \                libavcodec                         \                libswresample                      \                libswscale                         \                libavutil                          \CFLAGS += -Wall -O2 -gCFLAGS += $(shell pkg-config --cflags $(FFMPEG_LIBS))LDLIBS += $(shell pkg-config --libs $(FFMPEG_LIBS))EXAMPLES=       decoding_encoding                  \                filtering_video                    \                filtering_audio                    \                metadata                           \                muxing                             \OBJS=$(addsuffix .o,$(EXAMPLES))# the following examples make explicit use of the math librarydecoding_encoding: LDLIBS += -lm.phony: all cleanall: $(OBJS) $(EXAMPLES)clean:    rm -rf $(EXAMPLES) $(OBJS)

发现并非很复杂,于是决定研究它。上网查资料,知道了pkg-config这个东西,下面简单介绍一下。
pkg-config提供了下面几个功能:
1.检查库的版本号。如果所需要的库的版本不满足要求,它会打印出错误信息,避免链接错误版本的库文件。2.获得编译预处理参数,如宏定义,头文件的位置。3.获得链接参数,如库及依赖的其它库的位置,文件名及其它一些连接参数。4.自动加入所依赖的其它库的设置。这一切都自动的,库文件安装在哪里都没关系! 看makefile中的: $(shell pkg-config --cflags $(FFMPEG_LIBS))这句的意思是在Terminal(终端)中输入:pkg-config --cflags $(FFMPEG_LIBS),这里的$(FFMPEG_LIBS)可以用FFMPEG_LIBS: libavdevice  、 libavformat  、 libavfilter、libavcodec 、libswresample 、libswscale 、libavutil 等等来代替。
你可以输入命令试试:pkg-config --cflags libavdevice  。发现了跟make时候,差不多的一个错误:Package libavdevice  was not found in the pkg-config search path.
虽然得到错误,不过却很开心,起码找到了错误的来源,就是这个pkg-config,于是开始研究pkg-config的运行原理。
原来,为了让pkg-config可以得到这些信息,要求库的提供者,提供一个.pc文件,.pc文件里面存放的是一些头文件及库的地址。这些.pc文件默认放在/usr/share/pkgconfig里面,如果你改变了.pc的存放路径,必须要让计算机知道,所以需要修改 PKG_CONFIG_PATH 。假设我的.pc文件放到了/usr/local/lib/pkgconfig下,我需要做如下修改:
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH

现在大功告成,我们来make一下:发现,编译成功啦!!!
很多同学可能跟我一样很兴奋(要知道编译这个我竟然折腾了一个星期),但是,这里还有个小问题:如果你把Terminal关闭并重新打开一个新的Terminal,并且重新编译一次的话,你会发现,还是刚刚那些错误:Packae libname was not found in the pkg-config search path.
为什么呢?原来环境变量的设置只对当前的终端窗口有效。如果到了没有进行上述设置的终端窗口中,pkg-config 将找不到.pc 文件。
难道每次都要输入修改PKG_CONFIG_PATH 的命令才行吗,这也太麻烦了吧?对,笔者也觉得太麻烦,于是继续google,发现了下面几种方法,可以替代上面的繁琐的步骤: 1、将/usr/local/lib/pkgconfig中的所有.pc转移到/usr/share/pkgconfig中。 2、将修改路径命令:export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH,写入一个文件(如cyh_Path),每次编译之前先将该文件中的命令运行:$source  cyh_Path,然后再make 3、修改自己的用户配置文件中( ~/.bash_profile),在里面添加一句:export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH,重启之后即可。
三个方法均可以,笔者推荐的是第三种方法,当然是因为这样最简单了(笔者是个大懒人,不过很多时候,不就是因为懒,才学到一些东西,就像这三个方法的发现不就是因为懒吗?哈哈!)。




--------------------------------by-----zerocool---------------------------2012年10月3日22:06:54
                                     

热点排行