首页 > 开发 > C++ > 正文

请问ruby如何调用c++的动态库(.so)。

2017-09-11 21:25:16  来源: 网友分享

背景:
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文件中的函数呢?谢谢各位了

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

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 = 0Q1 = $(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.1hdrdir = /usr/include/ruby-1.9.1arch_hdrdir = /usr/include/ruby-1.9.1/$(arch)VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/rubyprefix = $(DESTDIR)/usrrubylibprefix = $(libdir)/$(RUBY_BASE_NAME)exec_prefix = $(prefix)vendorhdrdir = $(rubyhdrdir)/vendor_rubysitehdrdir = $(rubyhdrdir)/site_rubyrubyhdrdir = $(includedir)/$(RUBY_BASE_NAME)-$(ruby_version)vendordir = $(DESTDIR)/usr/lib/ruby/vendor_rubysitedir = $(DESTDIR)/usr/local/lib/site_rubyridir = $(datarootdir)/$(RI_BASE_NAME)mandir = $(prefix)/share/manlocaledir = $(datarootdir)/localelibdir = $(exec_prefix)/libpsdir = $(docdir)pdfdir = $(docdir)dvidir = $(docdir)htmldir = $(docdir)infodir = $(prefix)/share/infodocdir = $(datarootdir)/doc/$(PACKAGE)oldincludedir = $(DESTDIR)/usr/includeincludedir = $(prefix)/includelocalstatedir = $(DESTDIR)/varsharedstatedir = $(prefix)/comsysconfdir = $(DESTDIR)/etcdatadir = $(datarootdir)datarootdir = $(prefix)/sharelibexecdir = $(prefix)/lib/ruby1.9.1sbindir = $(exec_prefix)/sbinbindir = $(exec_prefix)/binrubylibdir = $(rubylibprefix)/$(ruby_version)archdir = $(rubylibdir)/$(arch)sitelibdir = $(sitedir)/$(ruby_version)sitearchdir = $(sitelibdir)/$(sitearch)vendorlibdir = $(vendordir)/$(ruby_version)vendorarchdir = $(vendorlibdir)/$(sitearch)NULLCMD = :CC = gccCXX = g++LIBRUBY = $(LIBRUBY_SO)LIBRUBY_A = lib$(RUBY_SO_NAME)-static.aLIBRUBYARG_SHARED = -l$(RUBY_SO_NAME)LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-staticempty =OUTFLAG = -o $(empty)COUTFLAG = -o $(empty)RUBY_EXTCONF_H = cflags   =  $(optflags) $(debugflags) $(warnflags)optflags = -O3debugflags = -ggdbwarnflags = -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declarationCFLAGS   = -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-aliasingldflags  = -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -L/build/buildd/ruby1.9.1-1.9.3.484/debian/lib -rdynamic -Wl,-export-dynamicdldflags =  ARCH_FLAG = DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG)LDSHARED = $(CC) -sharedLDSHAREDXX = $(CXX) -sharedAR = arEXEEXT = RUBY_BASE_NAME = rubyRUBY_INSTALL_NAME = ruby1.9.1RUBY_SO_NAME = ruby-1.9.1arch = x86_64-linuxsitearch = $(arch)ruby_version = 1.9.1ruby = /usr/bin/ruby1.9.1RUBY = $(ruby)RM = rm -fRM_RF = $(RUBY) -run -e rm -- -rfRMDIRS = rmdir --ignore-fail-on-non-empty -pMAKEDIRS = /bin/mkdir -pINSTALL = /usr/bin/install -cINSTALL_PROG = $(INSTALL) -m 0755INSTALL_DATA = $(INSTALL) -m 644COPY = cpTOUCH = exit >#### End of system configuration section. ####preload = libpath = . $(libdir)LIBPATH =  -L. -L$(libdir)DEFFILE = CLEANFILES = mkmf.logDISTCLEANFILES = DISTCLEANDIRS = extout = extout_prefix = target_prefix = LOCAL_LIBS = LIBS = $(LIBRUBYARG_SHARED) -lstdc++  -lpthread -lrt -ldl -lcrypt -lm   -lcSRCS = demo.cxx demo_wrap.cxxOBJS = demo.o demo_wrap.oTARGET = demoTARGET_NAME = demoTARGET_ENTRY = Init_$(TARGET_NAME)DLLIB = $(TARGET).soEXTSTATIC = 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  *.bakall:    $(DLLIB)static: $(STATIC_LIB).PHONY: all install static install-so install-rb.PHONY: clean clean-so clean-rbclean-static::clean-rb-default::clean-rb::clean-so::clean: clean-so clean-static clean-rb-default clean-rb        -$(Q)$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.timedistclean-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 || truerealclean: distcleaninstall: install-so install-rbinstall-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-defaultinstall-rb-default: pre-install-rb-defaultpre-install-rb: Makefilepre-install-rb-default: Makefilepre-install-rb-default:    $(ECHO) installing default demo libraries./.RUBYARCHDIR.time:    $(Q) $(MAKEDIRS) $(RUBYARCHDIR)    $(Q) $(TOUCH) $@site-install: site-install-so site-install-rbsite-install-so: install-sosite-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

解决方案

把你需要的lib 加进extconf.rb
看这里http://www.linuxtopia.org/onl...