今天需要把ffmpeg库合入工程项目中,结果遇到一个很奇怪的问题,单独的工程可以完美运行,但是合入到我们的主项目时,缺一直报错。。。这个问题非常郁闷,测试了半天,各种添加头文件库文件搜索路径测试,都没有解决这个问题。google一下,最后发现一个类似的问题,https://github.com/johmathe/Shotdetect/issues/1。终于搞明白怎么回事了,原来是ffmpeg库中使用了libavutil中有个time.h头文件。我们的工程还是用了cocos2d-x框架,这里面用到了系统类库的time.h头文件,但是我再引入ffmpeg库的时候,使用了搜索路径的方式导入,很郁闷就导致了后面的搜索路径覆盖了系统本身的time.h头文件。。。于是就发生了上面的报错。

找到问题之后,于是开始尝试解决办法,实际导入这种第三方类库,最重要的是两个问题,一个是设置静态库的搜索路径,还有一个就是头文件的路径。当我们把文件以group的形式加入到工程中时,xcode就会自动帮我们配置这些路径了。如果是静态库文件,xcode工程文件中Library Search Paths中会有相应的静态库的文件夹路径;头文件的话,则直接会被工程索引,但是这个问题就在于,以这种方式导入的话,头文件的使用就是直接以头文件的名称即可,不再带有工程路径,time.h就行。但是同样的问题还是存在,文件名的作用域会在整个工程中存在,会跟系统的头文件冲突,我的解决办法是从工程中删除掉头文件的引用,留下对静态库的引用。同时,在Header search Paths中添加ffmpeg的路径即可,这样即使在工程中没有这个头文件的引用,但是xcode会自动搜索目录,并且索引进来的,我们同样可以看到这些头文件,系统类库的头文件就是以这种方式引入的。这时,就可以达到这样的目的,time.h的文件对于编译器而言是libavtitl/time.h,这样在编译以后就不会引起冲突了。


删除工程中的头文件引用



在工程文件中添加头文件的搜索目录



另外,后面又遇到了一次类似的问题,一直无法解决。后来设置always search userpath为NO就解决了这个问题


Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐