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

背景:
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 = 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

回答:

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

以上是 请问ruby如何调用c++的动态库(.so)。 的全部内容, 来源链接: utcz.com/p/192767.html

回到顶部