码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-01-20 23:50:30      阅读:354      评论:0      收藏:0      [点我收藏+]

标签:

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

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

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

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

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

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

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

新增加了安装gst_pack动态库的代码

diff -Nur gst-python-0.10.22/codegen/gen_gst_import_code.py gst-python-0.10.22_test/codegen/gen_gst_import_code.py
--- gst-python-0.10.22/codegen/gen_gst_import_code.py	1970-01-01 08:00:00.000000000 +0800
+++ gst-python-0.10.22_test/codegen/gen_gst_import_code.py	2015-01-20 05:12:45.107817971 +0800
@@ -0,0 +1,33 @@
+import os,sys,random
+
+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 ();\n" % line[:-1])
+        d_handle.write("\nvoid __gst_import_%s ()\n{\n" % random.randint(0,10000) )
+        #d_handle.write("\nstatic void __gst_import_functions ()\n{\n")
+        for line in s_buff:
+            d_handle.write("    %s ();\n" % line[:-1])
+        d_handle.write("}\n\n")
+        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/codegen/gen_imp_code.sh gst-python-0.10.22_test/codegen/gen_imp_code.sh
--- gst-python-0.10.22/codegen/gen_imp_code.sh	1970-01-01 08:00:00.000000000 +0800
+++ gst-python-0.10.22_test/codegen/gen_imp_code.sh	2015-01-19 03:03:07.211836824 +0800
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+nm -g $1 | grep " U " | awk "{ print \$2}" | grep "^gst_"
+
diff -Nur gst-python-0.10.22/gst/gst_static_plugin_reg.c gst-python-0.10.22_test/gst/gst_static_plugin_reg.c
--- gst-python-0.10.22/gst/gst_static_plugin_reg.c	1970-01-01 08:00:00.000000000 +0800
+++ gst-python-0.10.22_test/gst/gst_static_plugin_reg.c	2015-01-18 23:20:09.490976826 +0800
@@ -0,0 +1,4 @@
+
+void init_register_static_gst_plugin()
+{
+}
diff -Nur gst-python-0.10.22/gst/Makefile.am gst-python-0.10.22_test/gst/Makefile.am
--- gst-python-0.10.22/gst/Makefile.am	2011-10-20 20:31:28.000000000 +0800
+++ gst-python-0.10.22_test/gst/Makefile.am	2015-01-21 06:17:45.551271251 +0800
@@ -53,9 +53,9 @@
 
 # GStreamer bindings
 _gst_la_CFLAGS = $(common_cflags)
-_gst_la_LIBADD = $(common_libadd) $(GST_BASE_LIBS)
+_gst_la_LIBADD = $(common_libadd)
 _gst_la_LDFLAGS = $(common_ldflags) -export-symbols-regex "^(init_gst|_PyGObject_API|pygstminiobject_).*" -	$(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) $(GST_NET_LIBS) $(GST_DP_LIBS)
+	-lgst_pack
 _gst_la_SOURCES = 		 	gst-argtypes.c 		 	gstmodule.c 		@@ -92,7 +92,7 @@
 interfaces_la_CFLAGS = $(common_cflags) $(GST_PLUGINS_BASE_CFLAGS)
 interfaces_la_LIBADD = $(common_libadd) -lgstinterfaces-$(GST_MAJORMINOR) 
 interfaces_la_LDFLAGS = $(common_ldflags) -	-export-symbols-regex "^(initinterface|_PyGObject_API).*" $(GST_PLUGINS_BASE_LIBS)
+	-export-symbols-regex "^(initinterface|_PyGObject_API).*" -lgst_pack
 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) $(GST_PLUGINS_BASE_LIBS) -lgstpbutils-0.10
+pbutils_la_LIBADD = $(common_libadd)  -lgst_pack
 pbutils_la_LDFLAGS = $(common_ldflags) -	-export-symbols-regex "^(initpbutils|_PyGObject_API).*" $(GST_PLUGINS_BASE_LIBS)
+	-export-symbols-regex "^(initpbutils|_PyGObject_API).*" -lgst_pack
 pbutils_la_SOURCES = pbutilsmodule.c gst-argtypes.c
 nodist_pbutils_la_SOURCES = pbutils.c
 PBUTILS_OVERRIDES = pbutils.override
@@ -129,7 +129,7 @@
  audio_la_CFLAGS = $(common_cflags) $(GST_PLUGINS_BASE_CFLAGS)
  audio_la_LIBADD = $(common_libadd) $(GST_PLUGINS_BASE_LIBS) -lgstaudio-0.10
  audio_la_LDFLAGS = $(common_ldflags) -	-export-symbols-regex "^(initaudio|_PyGObject_API).*" $(GST_PLUGINS_BASE_LIBS)
+	-export-symbols-regex "^(initaudio|_PyGObject_API).*"  -lgst_pack
  audio_la_SOURCES = audiomodule.c gst-argtypes.c
  nodist_audio_la_SOURCES = audio.c
 audio.c: $(AUDIO_DEFS) $(AUDIO_OVERRIDES) $(GEN_FILES)
@@ -151,7 +151,7 @@
  video_la_CFLAGS = $(common_cflags) $(GST_PLUGINS_BASE_CFLAGS)
  video_la_LIBADD = $(common_libadd) $(GST_PLUGINS_BASE_LIBS) -lgstvideo-0.10
  video_la_LDFLAGS = $(common_ldflags) -	-export-symbols-regex "^(initvideo|_PyGObject_API).*" $(GST_PLUGINS_BASE_LIBS)
+	-export-symbols-regex "^(initvideo|_PyGObject_API).*" -lgst_pack
  video_la_SOURCES = videomodule.c gst-argtypes.c
  nodist_video_la_SOURCES = video.c
 video.c: $(VIDEO_DEFS) $(VIDEO_OVERRIDES) $(GEN_FILES)
@@ -173,13 +173,108 @@
  tag_la_CFLAGS = $(common_cflags) $(GST_PLUGINS_BASE_CFLAGS)
  tag_la_LIBADD = $(common_libadd) $(GST_PLUGINS_BASE_LIBS) -lgsttag-0.10
  tag_la_LDFLAGS = $(common_ldflags) -	-export-symbols-regex "^(inittag|_PyGObject_API).*" $(GST_PLUGINS_BASE_LIBS)
+	-export-symbols-regex "^(inittag|_PyGObject_API).*" -lgst_pack
  tag_la_SOURCES = tagmodule.c gst-argtypes.c
  nodist_tag_la_SOURCES = tag.c
 tag.c: $(TAG_DEFS) $(TAG_OVERRIDES) $(GEN_FILES)
 
 endif
 
+gstpackexecdir = /usr/lib
+gstpackexec_LTLIBRARIES = libgst_pack.la
+pygstexec_LTLIBRARIES: gstpackexec_LTLIBRARIES
+
+libgst_pack_lib = libgst_pack.la
+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_import.c
+CLEANFILES += lib_gst_import.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_import.c: lib_gst.a
+
+
+if HAVE_PYGOBJECT_2_16
+
+libgst_pack_la_LDFLAGS += $(GST_LIBS) $(GST_OPTION_LIBS)
+nodist_libgst_pack_la_SOURCES += libgstoption_import.c
+CLEANFILES += libgstoption_import.c
+noinst_LIBRARIES += libgstoption.a
+libgstoption_a_CFLAGS = $(common_cflags)
+libgstoption_a_SOURCES = ../gstoptionmodule.c
+libgstoption_import.c: libgstoption.a
+
+endif
+
+libgst_pack_la_LDFLAGS += $(GST_PLUGINS_BASE_LIBS) -lgstinterfaces-$(GST_MAJORMINOR) 
+nodist_libgst_pack_la_SOURCES += libinterfaces_import.c
+CLEANFILES += libinterfaces_import.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_import: libinterfaces.a
+
+
+libgst_pack_la_LDFLAGS +=  -lgstpbutils-0.10
+nodist_libgst_pack_la_SOURCES += libpbutils_import.c
+CLEANFILES += libpbutils_import.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_import.c: libpbutils.a
+
+
+if HAVE_GST_AUDIO
+
+ libgst_pack_la_LDFLAGS +=  -lgstaudio-0.10
+ nodist_libgst_pack_la_SOURCES += libaudio_import.c
+ CLEANFILES += libaudio_import.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_import.c: libaudio.a
+
+
+endif
+
+if HAVE_GST_VIDEO
+
+ libgst_pack_la_LDFLAGS += -lgstvideo-0.10
+ nodist_libgst_pack_la_SOURCES += libvideo_import.c
+ CLEANFILES += libvideo_import.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_import.c: libvideo.a
+
+
+endif
+
+if HAVE_GST_TAG
+
+ libgst_pack_la_LDFLAGS += -lgsttag-0.10
+ nodist_libgst_pack_la_SOURCES += libtag_import.c
+ CLEANFILES += libtag_import.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_import.c: libtag.a
+
+endif
+
+%_import.c: %.a
+	/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/gst/Makefile_static.am gst-python-0.10.22_test/gst/Makefile_static.am
--- gst-python-0.10.22/gst/Makefile_static.am	1970-01-01 08:00:00.000000000 +0800
+++ gst-python-0.10.22_test/gst/Makefile_static.am	2015-01-19 04:20:32.000000000 +0800
@@ -0,0 +1,92 @@
+
+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/gst-python.spec gst-python-0.10.22_test/gst-python.spec
--- gst-python-0.10.22/gst-python.spec	2011-10-30 00:06:10.000000000 +0800
+++ gst-python-0.10.22_test/gst-python.spec	1970-01-01 08:00:00.000000000 +0800
@@ -1,100 +0,0 @@
-%define         majorminor      0.10
-%define         gstreamer       gstreamer
-%define		_pygtk		2.6.3
-%define		_gst		0.10.20
-
-Name:           %{gstreamer}-python
-Version:        0.10.22
-Release:        1
-Summary:        Python bindings for GStreamer.
-
-Group:          Development/Languages
-License:        LGPL
-URL:            http://gstreamer.freedesktop.org/
-Source: 	http://gstreamer.freedesktop.org/src/gst-python/gst-python-%{version}.tar.gz
-
-BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
-
-Requires:	python >= 2
-Requires:	gnome-python2
-Requires:	pygtk2 >= %_pygtk
-Requires:	%{gstreamer}
-Requires:	%{gstreamer}-plugins-base
-
-BuildRequires:	python >= 2
-BuildRequires:  python-devel >= 2
-BuildRequires:  pygtk2-devel >= %_pygtk
-BuildRequires:	xmlto
-BuildRequires:	links
-
-BuildRequires:	%{gstreamer}-devel >= %_gst
-BuildRequires:	%{gstreamer}-plugins-base-devel >= %_gst
-
-# sigh, libtool
-BuildRequires:  gcc-c++
-
-%description
-This module contains a wrapper that allows GStreamer applications
-to be written in Python.
-
-%prep
-%setup -q -n gst-python-%{version}
-
-%build
-%configure
-make %{?_smp_mflags}
-
-%install
-rm -rf $RPM_BUILD_ROOT
-
-%makeinstall
-find $RPM_BUILD_ROOT -type f -name "*.la" -exec rm -f {} ‘;‘
-
-%clean
-rm -rf $RPM_BUILD_ROOT
-
-%files
-%defattr(-,root,root,-)
-%doc AUTHORS COPYING ChangeLog NEWS README gst-python.doap
-%dir %{_libdir}/python?.?/site-packages/gst-%{majorminor}
-%{_libdir}/python?.?/site-packages/pygst.pth
-%{_libdir}/python?.?/site-packages/pygst.py
-%{_libdir}/python?.?/site-packages/gst-%{majorminor}/gst/__init__.py*
-%{_libdir}/python?.?/site-packages/gst-%{majorminor}/gst/extend
-%{_libdir}/python?.?/site-packages/gst-%{majorminor}/gst/_gst.so
-%{_libdir}/python?.?/site-packages/gst-%{majorminor}/gst/interfaces.so
-%{_libdir}/python?.?/site-packages/gst-%{majorminor}/gst/pbutils.so
-%{_libdir}/gstreamer-%{majorminor}/libgstpython.so
-%{_libdir}/python?.?/site-packages/gst-%{majorminor}/gst/audio.so
-%{_libdir}/python?.?/site-packages/gst-%{majorminor}/gst/tag.so
-%{_libdir}/python?.?/site-packages/gst-%{majorminor}/gst/video.so
-%{_libdir}/python?.?/site-packages/gstoption.so
-
-
-%{_datadir}/gst-python
-%{_libdir}/pkgconfig/gst-python-%{majorminor}.pc
-
-%changelog
-* Fri Dec 15 2006 Thomas Vander Stichele <thomas at apestaart dot org>
-- add doap file
-
-* Tue Dec 20 2005 Thomas Vander Stichele <thomas at apestaart dot org>
-- updated spec file
-
-* Thu Oct 06 2005 Edward Hervey < edward at fluendo dot com >
-- Updated spec file for 0.9
-
-* Fri Nov 05 2004 Christian Schaller < uraeus at gnome org >
-- Remerged spec file with cvs version
-
-* Tue Oct 12 2004 Thomas Vander Stichele <thomas at apestaart dot org>
-- 0.7.93-0.fdr.1: new upstream release
-
-* Mon Jun 21 2004 Thomas Vander Stichele <thomas at apestaart dot org>
-- 0.7.92-0.fdr.1: new upstream release
-
-* Wed Mar 31 2004 Thomas Vander Stichele <thomas at apestaart dot org>
-- 0.7.91-0.fdr.1: new upstream release
-
-* Tue Sep 02 2003 Thomas Vander Stichele <thomas at apestaart dot org>
-- 0.1.0-0.fdr.1: first fedora release
diff -Nur gst-python-0.10.22/Makefile.am gst-python-0.10.22_test/Makefile.am
--- gst-python-0.10.22/Makefile.am	2010-11-20 02:44:51.000000000 +0800
+++ gst-python-0.10.22_test/Makefile.am	2015-01-20 04:50:37.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 = $(GST_LIBS) $(GST_OPTION_LIBS)
-common_ldflags = -module -avoid-version
+common_libadd =
+common_ldflags = -module -avoid-version 
 
 # include before EXTRA_DIST for win32 assignment
 include $(top_srcdir)/common/win32.mak
@@ -22,6 +22,10 @@
 	-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 

 

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

标签:

原文地址:http://www.cnblogs.com/eaglexmw/p/4237623.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!