请问ruby如何调用c++的动态库(.so)。
高洛峰
高洛峰 2016-11-09 14:41:38
0
1
1166

背景:
1.c++有DEMO_Init()、time()、add()函数。
2.而DEMO_Init()函数中又有小函数NET_DEV_Init(),小函数在.so中。
3.需要用ruby调用DEMO_Init()、time()、add()函数。
4.用的是swig工具。最后能成功调用time()、add()。

问题:

1.但是不能调用DEMO_Init(),会报错没有NET_DEV_Init()。但是NET_DEV_Init()在动态库.so文件中,我无法得知里面还有多少层小小函数啊啊,这可怎么办

不知道表述清楚没?求大神来指教我该怎么用ruby调用.so文件中的函数呢?谢谢各位了

bVFkzX.png

补充:
2.c++那边的工程师确定他已经把.so文件链接好了。是不是我ruby这边也需要把c++的.so文件也链接起来?那是不是该在extconf.rb中的lib中罗列出来呢?

bVFkzX.png

3.但是我罗列了c++的.so也不成功耶,还是没法调用,求教啊
4.还想请教一下Makefile中的
LIBS = $(LIBRUBYARG_SHARED) -lstdc++ -lpthread -lrt -ldl -lcrypt -lm -lc
是什么意思啊

补充:错误
irb(main):001:0> require 'demo'
=> true
irb(main):002:0> Demo.DEMO_Init
irb: symbol lookup error: /usr/local/lib/site_ruby/1.9.1/x86_64-linux/demo.so: undefined symbol: NET_DEV_Init

补充:Makefile

SHELL = /bin/sh # V=0 quiet, V=1 verbose. other values don't work. V = 0 Q1 = $(V:1=) Q = $(Q1:0=@) n=$(NULLCMD) ECHO1 = $(V:1=@$n) ECHO = $(ECHO1:0=@echo) #### Start of system configuration section. #### srcdir = . topdir = /usr/include/ruby-1.9.1 hdrdir = /usr/include/ruby-1.9.1 arch_hdrdir = /usr/include/ruby-1.9.1/$(arch) VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby prefix = $(DESTDIR)/usr rubylibprefix = $(libdir)/$(RUBY_BASE_NAME) exec_prefix = $(prefix) vendorhdrdir = $(rubyhdrdir)/vendor_ruby sitehdrdir = $(rubyhdrdir)/site_ruby rubyhdrdir = $(includedir)/$(RUBY_BASE_NAME)-$(ruby_version) vendordir = $(DESTDIR)/usr/lib/ruby/vendor_ruby sitedir = $(DESTDIR)/usr/local/lib/site_ruby ridir = $(datarootdir)/$(RI_BASE_NAME) mandir = $(prefix)/share/man localedir = $(datarootdir)/locale libdir = $(exec_prefix)/lib psdir = $(docdir) pdfdir = $(docdir) dvidir = $(docdir) htmldir = $(docdir) infodir = $(prefix)/share/info docdir = $(datarootdir)/doc/$(PACKAGE) oldincludedir = $(DESTDIR)/usr/include includedir = $(prefix)/include localstatedir = $(DESTDIR)/var sharedstatedir = $(prefix)/com sysconfdir = $(DESTDIR)/etc datadir = $(datarootdir) datarootdir = $(prefix)/share libexecdir = $(prefix)/lib/ruby1.9.1 sbindir = $(exec_prefix)/sbin bindir = $(exec_prefix)/bin rubylibdir = $(rubylibprefix)/$(ruby_version) archdir = $(rubylibdir)/$(arch) sitelibdir = $(sitedir)/$(ruby_version) sitearchdir = $(sitelibdir)/$(sitearch) vendorlibdir = $(vendordir)/$(ruby_version) vendorarchdir = $(vendorlibdir)/$(sitearch) NULLCMD = : CC = gcc CXX = g++ LIBRUBY = $(LIBRUBY_SO) LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME) LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static empty = OUTFLAG = -o $(empty) COUTFLAG = -o $(empty) RUBY_EXTCONF_H = cflags = $(optflags) $(debugflags) $(warnflags) optflags = -O3 debugflags = -ggdb warnflags = -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration CFLAGS = -fPIC -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wall -fno-strict-aliasing -fPIC $(ARCH_FLAG) INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) DEFS = CPPFLAGS = -D_FORTIFY_SOURCE=2 $(DEFS) $(cppflags) CXXFLAGS = $(CFLAGS) -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wall -fno-strict-aliasing ldflags = -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -L/build/buildd/ruby1.9.1-1.9.3.484/debian/lib -rdynamic -Wl,-export-dynamic dldflags = ARCH_FLAG = DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG) LDSHARED = $(CC) -shared LDSHAREDXX = $(CXX) -shared AR = ar EXEEXT = RUBY_BASE_NAME = ruby RUBY_INSTALL_NAME = ruby1.9.1 RUBY_SO_NAME = ruby-1.9.1 arch = x86_64-linux sitearch = $(arch) ruby_version = 1.9.1 ruby = /usr/bin/ruby1.9.1 RUBY = $(ruby) RM = rm -f RM_RF = $(RUBY) -run -e rm -- -rf RMDIRS = rmdir --ignore-fail-on-non-empty -p MAKEDIRS = /bin/mkdir -p INSTALL = /usr/bin/install -c INSTALL_PROG = $(INSTALL) -m 0755 INSTALL_DATA = $(INSTALL) -m 644 COPY = cp TOUCH = exit > #### End of system configuration section. #### preload = libpath = . $(libdir) LIBPATH = -L. -L$(libdir) DEFFILE = CLEANFILES = mkmf.log DISTCLEANFILES = DISTCLEANDIRS = extout = extout_prefix = target_prefix = LOCAL_LIBS = LIBS = $(LIBRUBYARG_SHARED) -lstdc++ -lpthread -lrt -ldl -lcrypt -lm -lc SRCS = demo.cxx demo_wrap.cxx OBJS = demo.o demo_wrap.o TARGET = demo TARGET_NAME = demo TARGET_ENTRY = Init_$(TARGET_NAME) DLLIB = $(TARGET).so EXTSTATIC = STATIC_LIB = BINDIR = $(bindir) RUBYCOMMONDIR = $(sitedir)$(target_prefix) RUBYLIBDIR = $(sitelibdir)$(target_prefix) RUBYARCHDIR = $(sitearchdir)$(target_prefix) HDRDIR = $(rubyhdrdir)/ruby$(target_prefix) ARCHHDRDIR = $(rubyhdrdir)/$(arch)/ruby$(target_prefix) TARGET_SO = $(DLLIB) CLEANLIBS = $(TARGET).so CLEANOBJS = *.o *.bak all: $(DLLIB) static: $(STATIC_LIB) .PHONY: all install static install-so install-rb .PHONY: clean clean-so clean-rb clean-static:: clean-rb-default:: clean-rb:: clean-so:: clean: clean-so clean-static clean-rb-default clean-rb -$(Q)$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time distclean-rb-default:: distclean-rb:: distclean-so:: distclean: clean distclean-so distclean-rb-default distclean-rb @-$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log @-$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) @-$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true realclean: distclean install: install-so install-rb install-so: $(RUBYARCHDIR)/$(DLLIB) $(RUBYARCHDIR)/$(DLLIB): $(DLLIB) -$(Q)$(MAKEDIRS) $(@D) $(INSTALL_PROG) $(DLLIB) $(@D) clean-static:: -$(Q)$(RM) $(STATIC_LIB) install-rb: pre-install-rb install-rb-default install-rb-default: pre-install-rb-default pre-install-rb: Makefile pre-install-rb-default: Makefile pre-install-rb-default: $(ECHO) installing default demo libraries ./.RUBYARCHDIR.time: $(Q) $(MAKEDIRS) $(RUBYARCHDIR) $(Q) $(TOUCH) $@ site-install: site-install-so site-install-rb site-install-so: install-so site-install-rb: install-rb .SUFFIXES: .c .m .cc .mm .cxx .cpp .C .o .cc.o: $(ECHO) compiling $(<) $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< .mm.o: $(ECHO) compiling $(<) $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< .cxx.o: $(ECHO) compiling $(<) $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< .cpp.o: $(ECHO) compiling $(<) $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< .C.o: $(ECHO) compiling $(<) $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $< .c.o: $(ECHO) compiling $(<) $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $< .m.o: $(ECHO) compiling $(<) $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $< $(DLLIB): $(OBJS) Makefile $(ECHO) linking shared-object $(DLLIB) -$(Q)$(RM) $(@) $(Q) $(LDSHAREDXX) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) $(OBJS): $(hdrdir)/ruby.h $(hdrdir)/ruby/defines.h $(arch_hdrdir)/ruby/config.h


高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回覆 (1)
三叔

把你需要的lib 加进extconf.rb

http://www.linuxtopia.org/online_books/programming_books/ruby_tutorial/Extending_Ruby_Creating_a_Makefile_with_extconf.rb.html

    最新下載
    更多>
    網站特效
    網站源碼
    網站素材
    前端模板
    關於我們 免責聲明 Sitemap
    PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!