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"