• python2-gst0.10制作静态包的补丁


    gst制作成了静态库,而python2的gst有多个动态库引用gst的库

    因此,想了一个办法将python2所需要的gst打包成一个单独的共享库

    办法就是,将python2_gst所有的.so先制作成.a

    通过nm -g加过滤的办法得到所有链接的gst函数

    将这些函数生成一个小文件,在一个静态函数中引用所有这些函数

    然后,将这个小文件编译成so文件,并链接gst库,这样,python2_gst所需要的gst函数就全部链接进来了

    同时,可以将gst动态插件的方式也在启动时就注册进来,那样,python2_gst得到的包就是自包含的了

    diff -Nur gst-python-0.10.22_test/codegen/gen_gst_import_code.py gst-python-0.10.22/codegen/gen_gst_import_code.py
    --- gst-python-0.10.22_test/codegen/gen_gst_import_code.py	2015-01-18 22:01:56.753066000 +0800
    +++ gst-python-0.10.22/codegen/gen_gst_import_code.py	1970-01-01 08:00:00.000000000 +0800
    @@ -1,32 +0,0 @@
    -import os,sys
    -
    -def main(argv):
    -    if len(argv) < 3:
    -        print "need more params."
    -        return -1
    -
    -    src_file = argv[1]
    -    dest_file = argv[2]
    -    try:
    -        s_handle = open(src_file, "r")
    -        s_buff = s_handle.readlines()
    -        s_handle.close()
    -    except Exception, detail:
    -        print "Exception: {0}".format(detail)
    -        return -1
    -    try:
    -        d_handle = open(dest_file, "w")
    -        for line in s_buff:
    -            d_handle.write("extern void %s ();
    " % line[:-1])
    -        d_handle.write("
    static void __gst_import_functions ()
    {
    ")
    -        for line in s_buff:
    -            d_handle.write("    %s ();
    " % line[:-1])
    -        d_handle.write("}
    
    ")
    -        d_handle.close()
    -    except Exception, detail:
    -        print "Exception: {0}".format(detail)
    -        return -1
    -    return 0
    -     
    -if __name__ == '__main__':
    -    sys.exit(main(sys.argv))
    diff -Nur gst-python-0.10.22_test/codegen/gen_imp_code.sh gst-python-0.10.22/codegen/gen_imp_code.sh
    --- gst-python-0.10.22_test/codegen/gen_imp_code.sh	2015-01-19 03:03:07.211836824 +0800
    +++ gst-python-0.10.22/codegen/gen_imp_code.sh	1970-01-01 08:00:00.000000000 +0800
    @@ -1,4 +0,0 @@
    -#!/bin/sh
    -
    -nm -g $1 | grep " U " | awk "{ print $2}" | grep "^gst_"
    -
    diff -Nur gst-python-0.10.22_test/gst/gst_static_plugin_reg.c gst-python-0.10.22/gst/gst_static_plugin_reg.c
    --- gst-python-0.10.22_test/gst/gst_static_plugin_reg.c	2015-01-18 23:20:09.490976826 +0800
    +++ gst-python-0.10.22/gst/gst_static_plugin_reg.c	1970-01-01 08:00:00.000000000 +0800
    @@ -1,4 +0,0 @@
    -
    -void init_register_static_gst_plugin()
    -{
    -}
    diff -Nur gst-python-0.10.22_test/gst/Makefile.am gst-python-0.10.22/gst/Makefile.am
    --- gst-python-0.10.22_test/gst/Makefile.am	2015-01-19 03:51:50.722665473 +0800
    +++ gst-python-0.10.22/gst/Makefile.am	2011-10-20 20:31:28.000000000 +0800
    @@ -53,9 +53,9 @@
     
     # GStreamer bindings
     _gst_la_CFLAGS = $(common_cflags)
    -_gst_la_LIBADD = $(common_libadd)
    +_gst_la_LIBADD = $(common_libadd) $(GST_BASE_LIBS)
     _gst_la_LDFLAGS = $(common_ldflags) -export-symbols-regex "^(init_gst|_PyGObject_API|pygstminiobject_).*" 
    -	-lgst_pack
    +	$(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) $(GST_NET_LIBS) $(GST_DP_LIBS)
     _gst_la_SOURCES = 		
     	gst-argtypes.c 		
     	gstmodule.c 		
    @@ -90,9 +90,9 @@
     
     # GStreamer interfaces bindings
     interfaces_la_CFLAGS = $(common_cflags) $(GST_PLUGINS_BASE_CFLAGS)
    -interfaces_la_LIBADD = $(common_libadd) #-lgstinterfaces-$(GST_MAJORMINOR) 
    +interfaces_la_LIBADD = $(common_libadd) -lgstinterfaces-$(GST_MAJORMINOR) 
     interfaces_la_LDFLAGS = $(common_ldflags) 
    -	-export-symbols-regex "^(initinterface|_PyGObject_API).*" -lgst_pack
    +	-export-symbols-regex "^(initinterface|_PyGObject_API).*" $(GST_PLUGINS_BASE_LIBS)
     interfaces_la_SOURCES = interfacesmodule.c
     nodist_interfaces_la_SOURCES = interfaces.c
     INTERFACES_OVERRIDES = interfaces.override xoverlay.override
    @@ -103,9 +103,9 @@
     
     # GStreamer pbutils bindings
     pbutils_la_CFLAGS = $(common_cflags) $(GST_PLUGINS_BASE_CFLAGS)
    -pbutils_la_LIBADD = $(common_libadd)  -lgst_pack
    +pbutils_la_LIBADD = $(common_libadd) $(GST_PLUGINS_BASE_LIBS) -lgstpbutils-0.10
     pbutils_la_LDFLAGS = $(common_ldflags) 
    -	-export-symbols-regex "^(initpbutils|_PyGObject_API).*" -lgst_pack
    +	-export-symbols-regex "^(initpbutils|_PyGObject_API).*" $(GST_PLUGINS_BASE_LIBS)
     pbutils_la_SOURCES = pbutilsmodule.c gst-argtypes.c
     nodist_pbutils_la_SOURCES = pbutils.c
     PBUTILS_OVERRIDES = pbutils.override
    @@ -127,9 +127,9 @@
      audio_lib = audio.la
      pygstexec_LTLIBRARIES += $(audio_lib)
      audio_la_CFLAGS = $(common_cflags) $(GST_PLUGINS_BASE_CFLAGS)
    - audio_la_LIBADD = $(common_libadd) #$(GST_PLUGINS_BASE_LIBS) -lgstaudio-0.10
    + audio_la_LIBADD = $(common_libadd) $(GST_PLUGINS_BASE_LIBS) -lgstaudio-0.10
      audio_la_LDFLAGS = $(common_ldflags) 
    -	-export-symbols-regex "^(initaudio|_PyGObject_API).*"  -lgst_pack #$(GST_PLUGINS_BASE_LIBS)
    +	-export-symbols-regex "^(initaudio|_PyGObject_API).*" $(GST_PLUGINS_BASE_LIBS)
      audio_la_SOURCES = audiomodule.c gst-argtypes.c
      nodist_audio_la_SOURCES = audio.c
     audio.c: $(AUDIO_DEFS) $(AUDIO_OVERRIDES) $(GEN_FILES)
    @@ -149,9 +149,9 @@
      video_lib = video.la
      pygstexec_LTLIBRARIES += $(video_lib)
      video_la_CFLAGS = $(common_cflags) $(GST_PLUGINS_BASE_CFLAGS)
    - video_la_LIBADD = $(common_libadd) #$(GST_PLUGINS_BASE_LIBS) -lgstvideo-0.10
    + video_la_LIBADD = $(common_libadd) $(GST_PLUGINS_BASE_LIBS) -lgstvideo-0.10
      video_la_LDFLAGS = $(common_ldflags) 
    -	-export-symbols-regex "^(initvideo|_PyGObject_API).*" -lgst_pack # $(GST_PLUGINS_BASE_LIBS)
    +	-export-symbols-regex "^(initvideo|_PyGObject_API).*" $(GST_PLUGINS_BASE_LIBS)
      video_la_SOURCES = videomodule.c gst-argtypes.c
      nodist_video_la_SOURCES = video.c
     video.c: $(VIDEO_DEFS) $(VIDEO_OVERRIDES) $(GEN_FILES)
    @@ -171,105 +171,15 @@
      tag_lib = tag.la
      pygstexec_LTLIBRARIES += $(tag_lib)
      tag_la_CFLAGS = $(common_cflags) $(GST_PLUGINS_BASE_CFLAGS)
    - tag_la_LIBADD = $(common_libadd) # $(GST_PLUGINS_BASE_LIBS) -lgsttag-0.10
    + tag_la_LIBADD = $(common_libadd) $(GST_PLUGINS_BASE_LIBS) -lgsttag-0.10
      tag_la_LDFLAGS = $(common_ldflags) 
    -	-export-symbols-regex "^(inittag|_PyGObject_API).*"  -lgst_pack #$(GST_PLUGINS_BASE_LIBS)
    +	-export-symbols-regex "^(inittag|_PyGObject_API).*" $(GST_PLUGINS_BASE_LIBS)
      tag_la_SOURCES = tagmodule.c gst-argtypes.c
      nodist_tag_la_SOURCES = tag.c
     tag.c: $(TAG_DEFS) $(TAG_OVERRIDES) $(GEN_FILES)
     
     endif
     
    -libgst_pack_lib = libgst_pack.la
    -pygstexec_LTLIBRARIES += $(libgst_pack_lib)
    -libgst_pack_la_SOURCES = gst_static_plugin_reg.c
    -
    -libgst_pack_la_CFLAGS = $(common_cflags) -fPIC
    -libgst_pack_la_LIBADD = $(common_libadd) $(GST_BASE_LIBS)
    -libgst_pack_la_LDFLAGS = -shared -fPIC $(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) $(GST_NET_LIBS) $(GST_DP_LIBS)
    -nodist_libgst_pack_la_SOURCES = lib_gst.c
    -CLEANFILES += lib_gst.c
    -noinst_LIBRARIES = lib_gst.a
    -lib_gst_a_CFLAGS = $(_gst_la_CFLAGS)
    -lib_gst_a_SOURCES = $(_gst_la_SOURCES) $(nodist__gst_la_SOURCES)
    -_gst_la_DEPENDENCIES = $(libgst_pack_lib)
    -lib_gst.c: lib_gst.a
    -
    -
    -if HAVE_PYGOBJECT_2_16
    -libgst_pack_la_LDFLAGS += $(GST_LIBS) $(GST_OPTION_LIBS)
    -nodist_libgst_pack_la_SOURCES += libgstoption.c
    -CLEANFILES += libgstoption.c
    -noinst_LIBRARIES += libgstoption.a
    -libgstoption_a_CFLAGS = $(common_cflags)
    -libgstoption_a_SOURCES = ../gstoptionmodule.c
    -libgstoption.c: libgstoption.a
    -
    -
    -endif
    -
    -libgst_pack_la_LDFLAGS += $(GST_PLUGINS_BASE_LIBS) -lgstinterfaces-$(GST_MAJORMINOR) 
    -nodist_libgst_pack_la_SOURCES += libinterfaces.c
    -CLEANFILES += libinterfaces.c
    -noinst_LIBRARIES += libinterfaces.a
    -libinterfaces_a_CFLAGS = $(interfaces_la_CFLAGS)
    -libinterfaces_a_SOURCES = $(interfaces_la_SOURCES) $(nodist_interfaces_la_SOURCES)
    -interfaces_la_DEPENDENCIES = $(libgst_pack_lib)
    -libinterfaces.c: libinterfaces.a
    -
    -
    -libgst_pack_la_LDFLAGS +=  -lgstpbutils-0.10
    -nodist_libgst_pack_la_SOURCES += libpbutils.c
    -CLEANFILES += libpbutils.c
    -noinst_LIBRARIES += libpbutils.a
    -libpbutils_a_CFLAGS = $(pbutils_la_CFLAGS)
    -libpbutils_a_SOURCES = $(pbutils_la_SOURCES) $(nodist_pbutils_la_SOURCES)
    -pbutils_la_DEPENDENCIES = $(libgst_pack_lib)
    -libpbutils.c: libpbutils.a
    -
    -
    -if HAVE_GST_AUDIO
    - libgst_pack_la_LDFLAGS +=  -lgstaudio-0.10
    - nodist_libgst_pack_la_SOURCES += libaudio.c
    - CLEANFILES += libaudio.c
    - noinst_LIBRARIES += libaudio.a
    - libaudio_a_CFLAGS = $(audio_la_CFLAGS)
    - libaudio_a_SOURCES=$(audio_la_SOURCES) $(nodist_audio_la_SOURCES)
    - audio_la_DEPENDENCIES = $(libgst_pack_lib)
    -libaudio.c: libaudio.a
    -
    -
    -endif
    -
    -if HAVE_GST_VIDEO
    - libgst_pack_la_LDFLAGS += -lgstvideo-0.10
    - nodist_libgst_pack_la_SOURCES += libvideo.c
    - CLEANFILES += libvideo.c
    - noinst_LIBRARIES += libvideo.a
    - libvideo_a_CFLAGS = $(video_la_CFLAGS)
    - libvideo_a_SOURCES=$(video_la_SOURCES) $(nodist_video_la_SOURCES)
    - video_la_DEPENDENCIES = $(libgst_pack_lib)
    -libvideo.c: libvideo.a
    -
    -
    -endif
    -
    -if HAVE_GST_TAG
    - libgst_pack_la_LDFLAGS += -lgsttag-0.10
    - nodist_libgst_pack_la_SOURCES += libtag.c
    - CLEANFILES += libtag.c
    - noinst_LIBRARIES += libtag.a
    - libtag_a_CFLAGS = $(tag_la_CFLAGS)
    - libtag_a_SOURCES = $(tag_la_SOURCES) $(nodist_tag_la_SOURCES)
    - tag_la_DEPENDENCIES = $(libgst_pack_lib)
    -libtag.c: libtag.a
    -
    -endif
    -
    -.a.c:
    -	/bin/sh $(top_srcdir)/codegen/gen_imp_code.sh $< > $<.imp		
    -	&& $(PYTHON) $(top_srcdir)/codegen/gen_gst_import_code.py $<.imp $@	
    -	&& rm -f $<.imp
     
     .defs.c: 
     	$(AM_V_GEN)($(PYTHON) $(top_srcdir)/codegen/codegen.py 
    diff -Nur gst-python-0.10.22_test/gst/Makefile_static.am gst-python-0.10.22/gst/Makefile_static.am
    --- gst-python-0.10.22_test/gst/Makefile_static.am	2015-01-19 04:20:32.000000000 +0800
    +++ gst-python-0.10.22/gst/Makefile_static.am	1970-01-01 08:00:00.000000000 +0800
    @@ -1,92 +0,0 @@
    -
    -libgst_pack_lib = libgst_pack.la
    -pygstexec_LTLIBRARIES += $(libgst_pack_lib)
    -libgst_pack_la_SOURCES = gst_static_plugin_reg.c
    -
    -libgst_pack_la_CFLAGS = $(common_cflags) -fPIC
    -libgst_pack_la_LIBADD = $(common_libadd) $(GST_BASE_LIBS)
    -libgst_pack_la_LDFLAGS = -shared -fPIC $(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) $(GST_NET_LIBS) $(GST_DP_LIBS)
    -nodist_libgst_pack_la_SOURCES = lib_gst.c
    -CLEANFILES += lib_gst.c
    -noinst_LIBRARIES = lib_gst.a
    -lib_gst_a_CFLAGS = $(_gst_la_CFLAGS)
    -lib_gst_a_SOURCES = $(_gst_la_SOURCES) $(nodist__gst_la_SOURCES)
    -_gst_la_DEPENDENCIES = $(libgst_pack_lib)
    -lib_gst.c: lib_gst.a
    -
    -
    -if HAVE_PYGOBJECT_2_16
    -libgst_pack_la_LDFLAGS += $(GST_LIBS) $(GST_OPTION_LIBS)
    -nodist_libgst_pack_la_SOURCES += libgstoption.c
    -CLEANFILES += libgstoption.c
    -noinst_LIBRARIES += libgstoption.a
    -libgstoption_a_CFLAGS = $(common_cflags)
    -libgstoption_a_SOURCES = ../gstoptionmodule.c
    -libgstoption.c: libgstoption.a
    -
    -
    -endif
    -
    -libgst_pack_la_LDFLAGS += $(GST_PLUGINS_BASE_LIBS) -lgstinterfaces-$(GST_MAJORMINOR) 
    -nodist_libgst_pack_la_SOURCES += libinterfaces.c
    -CLEANFILES += libinterfaces.c
    -noinst_LIBRARIES += libinterfaces.a
    -libinterfaces_a_CFLAGS = $(interfaces_la_CFLAGS)
    -libinterfaces_a_SOURCES = $(interfaces_la_SOURCES) $(nodist_interfaces_la_SOURCES)
    -interfaces_la_DEPENDENCIES = $(libgst_pack_lib)
    -libinterfaces.c: libinterfaces.a
    -
    -
    -libgst_pack_la_LDFLAGS +=  -lgstpbutils-0.10
    -nodist_libgst_pack_la_SOURCES += libpbutils.c
    -CLEANFILES += libpbutils.c
    -noinst_LIBRARIES += libpbutils.a
    -libpbutils_a_CFLAGS = $(pbutils_la_CFLAGS)
    -libpbutils_a_SOURCES = $(pbutils_la_SOURCES) $(nodist_pbutils_la_SOURCES)
    -pbutils_la_DEPENDENCIES = $(libgst_pack_lib)
    -libpbutils.c: libpbutils.a
    -
    -
    -if HAVE_GST_AUDIO
    - libgst_pack_la_LDFLAGS +=  -lgstaudio-0.10
    - nodist_libgst_pack_la_SOURCES += libaudio.c
    - CLEANFILES += libaudio.c
    - noinst_LIBRARIES += libaudio.a
    - libaudio_a_CFLAGS = $(audio_la_CFLAGS)
    - libaudio_a_SOURCES=$(audio_la_SOURCES) $(nodist_audio_la_SOURCES)
    - audio_la_DEPENDENCIES = $(libgst_pack_lib)
    -libaudio.c: libaudio.a
    -
    -
    -endif
    -
    -if HAVE_GST_VIDEO
    - libgst_pack_la_LDFLAGS += -lgstvideo-0.10
    - nodist_libgst_pack_la_SOURCES += libvideo.c
    - CLEANFILES += libvideo.c
    - noinst_LIBRARIES += libvideo.a
    - libvideo_a_CFLAGS = $(video_la_CFLAGS)
    - libvideo_a_SOURCES=$(video_la_SOURCES) $(nodist_video_la_SOURCES)
    - video_la_DEPENDENCIES = $(libgst_pack_lib)
    -libvideo.c: libvideo.a
    -
    -
    -endif
    -
    -if HAVE_GST_TAG
    - libgst_pack_la_LDFLAGS += -lgsttag-0.10
    - nodist_libgst_pack_la_SOURCES += libtag.c
    - CLEANFILES += libtag.c
    - noinst_LIBRARIES += libtag.a
    - libtag_a_CFLAGS = $(tag_la_CFLAGS)
    - libtag_a_SOURCES = $(tag_la_SOURCES) $(nodist_tag_la_SOURCES)
    - tag_la_DEPENDENCIES = $(libgst_pack_lib)
    -libtag.c: libtag.a
    -
    -endif
    -
    -.a.c:
    -	/bin/sh $(top_srcdir)/codegen/gen_imp_code.sh $< > $<.imp		
    -	&& $(PYTHON) $(top_srcdir)/codegen/gen_gst_import_code.py $<.imp $@	
    -	&& rm -f $<.imp
    -
    diff -Nur gst-python-0.10.22_test/Makefile.am gst-python-0.10.22/Makefile.am
    --- gst-python-0.10.22_test/Makefile.am	2015-01-19 04:53:18.269354984 +0800
    +++ gst-python-0.10.22/Makefile.am	2010-11-20 02:44:51.000000000 +0800
    @@ -1,8 +1,8 @@
     SUBDIRS = common codegen gst examples plugin testsuite pkgconfig
     
     common_cflags = $(PYTHON_INCLUDES) $(PYGOBJECT_CFLAGS) $(GST_CFLAGS) $(GST_OPTION_CFLAGS) -fno-strict-aliasing
    -common_libadd =
    -common_ldflags = -module -avoid-version -Wl,--rpath,. -L./gst/.libs/ -lgst_pack
    +common_libadd = $(GST_LIBS) $(GST_OPTION_LIBS)
    +common_ldflags = -module -avoid-version
     
     # include before EXTRA_DIST for win32 assignment
     include $(top_srcdir)/common/win32.mak
    @@ -22,10 +22,6 @@
     	-export-symbols-regex "^(initgstoption|_PyGObject_API).*"
     gstoption_la_SOURCES = gstoptionmodule.c
     
    -if HAVE_PYGOBJECT_2_16
    -gstoption_la_DEPENDENCIES = gst/libgst_pack.la
    -endif
    -
     EXTRA_DIST = 
     	gstlibtoolimporter.py 
     	pygst.py.in 
    diff -Nur gst-python-0.10.22_test/win32/common/config.h gst-python-0.10.22/win32/common/config.h
    --- gst-python-0.10.22_test/win32/common/config.h	1970-01-01 08:00:00.000000000 +0800
    +++ gst-python-0.10.22/win32/common/config.h	2011-10-30 00:06:10.000000000 +0800
    @@ -0,0 +1,88 @@
    +/* config.h.in.  Generated from configure.ac by autoheader.  */
    +
    +/* Defined if gcov is enabled to force a rebuild due to config.h changing */
    +#undef GST_GCOV_ENABLED
    +
    +/* Define to 1 if you have the <dlfcn.h> header file. */
    +#undef HAVE_DLFCN_H
    +
    +/* Define to 1 if you have the <inttypes.h> header file. */
    +#undef HAVE_INTTYPES_H
    +
    +/* Define to 1 if you have the <memory.h> header file. */
    +#undef HAVE_MEMORY_H
    +
    +/* We can use the plugins-install methods */
    +#define HAVE_PLUGINS_INSTALL 1
    +
    +/* Defined if we have a 2.12 series pygobject */
    +#undef HAVE_PYGOBJECT_2_12
    +
    +/* Defined if we have a 2.16 series pygobject */
    +#undef HAVE_PYGOBJECT_2_16
    +
    +/* Define to 1 if you have the <stdint.h> header file. */
    +#undef HAVE_STDINT_H
    +
    +/* Define to 1 if you have the <stdlib.h> header file. */
    +#undef HAVE_STDLIB_H
    +
    +/* Define to 1 if you have the <strings.h> header file. */
    +#undef HAVE_STRINGS_H
    +
    +/* Define to 1 if you have the <string.h> header file. */
    +#undef HAVE_STRING_H
    +
    +/* Define to 1 if you have the <sys/stat.h> header file. */
    +#undef HAVE_SYS_STAT_H
    +
    +/* Define to 1 if you have the <sys/types.h> header file. */
    +#undef HAVE_SYS_TYPES_H
    +
    +/* Define to 1 if you have the <unistd.h> header file. */
    +#undef HAVE_UNISTD_H
    +
    +/* Define if valgrind should be used */
    +#undef HAVE_VALGRIND
    +
    +/* We can use the videoorientation interface */
    +#define HAVE_VIDEO_ORIENTATION_INTERFACE 1
    +
    +/* Define to 1 if your C compiler doesn't accept -c and -o together. */
    +#undef NO_MINUS_C_MINUS_O
    +
    +/* Name of package */
    +#define PACKAGE "gst-python"
    +
    +/* Define to the address where bug reports for this package should be sent. */
    +#define PACKAGE_BUGREPORT "http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer"
    +
    +/* Define to the full name of this package. */
    +#define PACKAGE_NAME "GStreamer Python Bindings"
    +
    +/* Define to the full name and version of this package. */
    +#define PACKAGE_STRING "GStreamer Python Bindings 0.10.22"
    +
    +/* Define to the one symbol short name of this package. */
    +#define PACKAGE_TARNAME "gst-python"
    +
    +/* Define to the version of this package. */
    +#define PACKAGE_VERSION "0.10.22"
    +
    +/* PyGst major version */
    +#define PYGST_MAJOR_VERSION 0
    +
    +/* PyGst micro version */
    +#define PYGST_MICRO_VERSION 22
    +
    +/* PyGst minor version */
    +#define PYGST_MINOR_VERSION 10
    +
    +/* PyGst nano version */
    +#define PYGST_NANO_VERSION 0
    +
    +/* Define to 1 if you have the ANSI C header files. */
    +#undef STDC_HEADERS
    +
    +/* Version number of package */
    +#define VERSION "0.10.22"
    
  • 相关阅读:
    动画效果(二)
    动画效果(一)
    高级事件(二)
    高级事件(一)
    事件对象(二)
    事件对象(一)
    使用jquery ajax代替iframe
    SQL语句汇总(终篇)—— 表联接与联接查询
    SQL语句汇总(三)——聚合函数、分组、子查询及组合查询
    SQL语句汇总(二)——数据修改、数据查询
  • 原文地址:https://www.cnblogs.com/eaglexmw/p/4232295.html
Copyright © 2020-2023  润新知