zoukankan      html  css  js  c++  java
  • 一步步实现windows版ijkplayer系列文章之五——使用automake生成makefile

    一步步实现windows版ijkplayer系列文章之一——Windows10平台编译ffmpeg 4.0.2,生成ffplay
    一步步实现windows版ijkplayer系列文章之二——Ijkplayer播放器源码分析之音视频输出——视频篇
    一步步实现windows版ijkplayer系列文章之三——Ijkplayer播放器源码分析之音视频输出——音频篇
    一步步实现windows版ijkplayer系列文章之四——windows下编译ijkplyer版ffmpeg
    一步步实现windows版ijkplayer系列文章之五——使用automake一步步生成makefile
    一步步实现windows版ijkplayer系列文章之六——SDL2源码分析之OpenGL ES在windows上的渲染过程
    一步步实现windows版ijkplayer系列文章之七——终结篇(附源码)

    一步步实现windows版ijkplayer系列文章之五——使用automake一步步生成makefile

    上一篇文章我们把ffmpeg库成功在windows平台下编译成dll了,ffmpeg的编译方案是跨平台的,直接使用它的现成的configure文件用于生成makefile,但是ijkplayer的另外两个库ijkplayer和ijksdl只支持android和IOS平台,因此在windows平台的编译需要自己实现,我们打算使用automake,先熟悉一下,从网络搜罗了两个例子,在自己的环境里面一步步成功生成了makefile,其中有些坑,现在将这些步骤记录下来。

    准备环境

    平台 windows mingw

    autoconf 版本:2.68

    automake版本:1.11.1

    一个简单例子

    创建文件夹hello,进入文件夹后编辑一个简单的hello.c文件

    #include <stdio.h>
     int main(int argc, char** argv)
     {
        printf("Hello, automake!
    ");
        return 0;
    }
    

    手动创建Makefile.am,內容如下:

    AUTOMAKE_OPTIONS= foreign
    bin_PROGRAMS= hello
    
    hello_SOURCES= hello.c
    

    执行autoscan,目录变化如下:

    $ ls -l
    total 2
    drwxr-xr-x 2 zexu Administrators   0 Oct 20 12:14 autom4te.cache
    -rw-r--r-- 1 zexu Administrators   0 Oct 20 12:14 autoscan-2.68.log
    -rw-r--r-- 1 zexu Administrators 495 Oct 20 12:14 configure.scan
    -rw-r--r-- 1 zexu Administrators 100 Oct 18 07:46 hello.c
    

    看一下configure.scan的内容:

    #                                               -*- Autoconf -*-
    # Process this file with autoconf to produce a configure script.
    
    AC_PREREQ([2.68])
    AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
    AC_CONFIG_SRCDIR([hello.c])
    AC_CONFIG_HEADERS([config.h])
    
    # Checks for programs.
    AC_PROG_CC
    
    # Checks for libraries.
    
    # Checks for header files.
    
    # Checks for typedefs, structures, and compiler characteristics.
    
    # Checks for library functions.
    
    AC_CONFIG_FILES([Makefile])
    AC_OUTPUT
    

    将此文件重命名为configure.in,执行autolocal,autoconf,生成configure:

    $ ls -lh
    total 111K
    drwxr-xr-x 2 zexu Administrators    0 Oct 20 12:29 autom4te.cache
    -rw-r--r-- 1 zexu Administrators    0 Oct 20 12:14 autoscan-2.68.log
    -rwxr-xr-x 1 zexu Administrators 109K Oct 20 12:29 configure
    -rw-r--r-- 1 zexu Administrators  495 Oct 20 12:14 configure.in
    -rw-r--r-- 1 zexu Administrators  100 Oct 18 07:46 hello.c
    

    执行如下automake命令:

    $ automake --add-missing
    configure.in: no proper invocation of AM_INIT_AUTOMAKE was found.
    configure.in: You should verify that configure.in invokes AM_INIT_AUTOMAKE,
    configure.in: that aclocal.m4 is present in the top-level directory,
    configure.in: and that aclocal.m4 was recently regenerated (using aclocal).
    configure.in:7: required file `config.h.in' not found
    Makefile.am: installing `./depcomp'
    /mingw/share/automake-1.11/am/depend2.am: am__fastdepCC does not appear in AM_CONDITIONAL
    /mingw/share/automake-1.11/am/depend2.am:   The usual way to define `am__fastdepCC' is to add `AC_PROG_CC'
    /mingw/share/automake-1.11/am/depend2.am:   to `configure.in' and run `aclocal' and `autoconf' again.
    /mingw/share/automake-1.11/am/depend2.am: AMDEP does not appear in AM_CONDITIONAL
    /mingw/share/automake-1.11/am/depend2.am:   The usual way to define `AMDEP' is to add one of the compiler tests
    /mingw/share/automake-1.11/am/depend2.am:     AC_PROG_CC, AC_PROG_CXX, AC_PROG_CXX, AC_PROG_OBJC,
    /mingw/share/automake-1.11/am/depend2.am:     AM_PROG_AS, AM_PROG_GCJ, AM_PROG_UPC
    /mingw/share/automake-1.11/am/depend2.am:   to `configure.in' and run `aclocal' and `autoconf' again.
    

    看到出错了,在configure.in中添加如下信息:

    AM_INIT_AUTOMAKE([-Wall -Werror foreign])
    

    再次执行aclocal,autoconf和automake

    zexu@DESKTOP-R4T030U ~/devel/hello
    $ aclocal
    
    zexu@DESKTOP-R4T030U ~/devel/hello
    $ autoconf
    
    $ automake --add-missing
    configure.in:9: installing `./install-sh'
    configure.in:9: installing `./missing'
    configure.in:7: required file `config.h.in' not found
    

    执行autoheader,生成头文件后再次automake,最后成功,可见没有任何无误提示。

    zexu@DESKTOP-R4T030U ~/devel/hello
    $ automake --add-missing
    

    最后执行configure,生成Makefile文件:

    zexu@DESKTOP-R4T030U ~/devel/hello
    $ ./configure
    

    执行make,生成hello.exe:

    zexu@DESKTOP-R4T030U ~/devel/hello
    $ make
    make  all-am
    make[1]: Entering directory `/home/zexu/devel/hello'
    gcc -DHAVE_CONFIG_H -I.     -g -O2 -MT hello.o -MD -MP -MF .deps/hello.Tpo -c -o hello.o hello.c
    mv -f .deps/hello.Tpo .deps/hello.Po
    gcc  -g -O2   -o hello.exe hello.o
    make[1]: Leaving directory `/home/zexu/devel/hello'
    
    zexu@DESKTOP-R4T030U ~/devel/hello
    $ ls
    Makefile     aclocal.m4         config.h     config.status  depcomp    hello.o     stamp-h1
    Makefile.am  autom4te.cache     config.h.in  configure      hello.c    install-sh
    Makefile.in  autoscan-2.68.log  config.log   configure.in   hello.exe  missing
    

    一个复杂一些的例子

    这个例子使用了libtool,我把代码提交到了github,先把其clone下来:

    git clone https://github.com/harlanc/automake_examples.git
    

    进入example_2,先看一下目录结构:

    $ ls -R
    .:
    Makefile.am  configure.in  error.c  error.h  lib  main.c  replace
    
    ./lib:
    Makefile.am  source.c  source.h
    
    ./replace:
    Makefile.am  basename.c  dummy.c
    

    执行下面的命令:

    zexu@DESKTOP-R4T030U ~/automake_examples/example_2
    $ aclocal
    
    zexu@DESKTOP-R4T030U ~/automake_examples/example_2
    $ autoheader
    
    zexu@DESKTOP-R4T030U ~/automake_examples/example_2
    $ automake --add-missing --copy
    configure.in:11: installing `./config.guess'
    configure.in:11: installing `./config.sub'
    configure.in:8: installing `./install-sh'
    configure.in:11: required file `./ltmain.sh' not found
    configure.in:8: installing `./missing'
    lib/Makefile.am: installing `./depcomp'
    

    看到有一个错误,执行下面的语句:

    $libtoolize --automake --copy --debug --force
    

    在此执行automake:

    $ automake --add-missing --copy
    

    最后成功,执行autoconf和configure:

    zexu@DESKTOP-R4T030U ~/automake_examples/example_2
    $ autoconf
    
    zexu@DESKTOP-R4T030U ~/automake_examples/example_2
    $ ./configure
    

    最后生成Makefile文件,执行make,生成可执行文件:

    $ make
    

    最后成功。

    参考

    Convenience-Libraries

    轻轻松松生成makefile

  • 相关阅读:
    微信公众平台订阅号和服务号和企业号的区别
    微信支付现金红包接口说明及应用实例代码
    Android开发环境配置
    在自己的android工程中使用actionbarsherlock以及slidingmenu
    android个推推送平台的使用
    android网络
    android String 类型转换成UTF-8格式
    【转】android神一样的模拟器——genymotion
    基于百度云推送的实时通信客户端实现(三)
    基于百度云推送的实时通信客户端实现(二)
  • 原文地址:https://www.cnblogs.com/harlanc/p/9824780.html
Copyright © 2011-2022 走看看