Prev: Array index question
Next: class ExistingName
From: Daniel Berger on 25 Feb 2010 12:38 Hi, I'm having some trouble pre-declaring some VALUE's. I've got a VALUE cFoo I want to be visible to multiple source files. Say the layout is something like this: foo/ext/stuff/extconf.rb foo/ext/stuff/foo.c foo/ext/stuff/bar.c foo/ext/stuff/baz.h foo/ext/stuff/stuff.c I want to define all the class VALUE's in the header file. I would then like to be able to '#include "baz.h"' inside both foo.c and bar.c. However, that causes an ld error when I try to build the source files: ld: duplicate symbol _cFoo in foo.o and bar.o # extconf.rb require 'mkmf' create_makefile('stuff') # Rakefile require 'rake' require 'rake/extensiontask' Rake::ExtensionTask.new('stuff') // baz.h #ifndef BAZ_H_INCLUDED #define BAZ_H_INCLUDED #include <ruby.h> VALUE cFoo; VALUE cBar; #endif Why do I want to do this? In the long run, I'm trying to figure out how to setup Check_Type calls for my own classes, e.g. Check_Type(some_value, cFoo); Regards, Dan
From: Joel VanderWerf on 25 Feb 2010 14:17 Daniel Berger wrote: > I want to define all the class VALUE's in the header file. I would > then like to be able to '#include "baz.h"' inside both foo.c and > bar.c. However, that causes an ld error when I try to build the source > files: Try "extern VALUE ..." in the headers, and "VALUE ..." in one source file.
From: Daniel Berger on 25 Feb 2010 16:15 On Feb 25, 1:08 pm, Ken Bloom <kbl...(a)gmail.com> wrote: > Daniel Berger <djber...(a)gmail.com> wrote: > > Hi, > > > I'm having some trouble pre-declaring some VALUE's. I've got a VALUE > > cFoo I want to be visible to multiple source files. Say the layout is > > something like this: > > > foo/ext/stuff/extconf.rb > > foo/ext/stuff/foo.c > > foo/ext/stuff/bar.c > > foo/ext/stuff/baz.h > > foo/ext/stuff/stuff.c > > > I want to define all the class VALUE's in the header file. I would > > then like to be able to '#include "baz.h"' inside both foo.c and > > bar.c. However, that causes an ld error when I try to build the source > > files: > > > ld: duplicate symbol _cFoo in foo.o and bar.o > > > # extconf.rb > > require 'mkmf' > > create_makefile('stuff') > > > # Rakefile > > require 'rake' > > require 'rake/extensiontask' > > Rake::ExtensionTask.new('stuff') > > > // baz.h > > #ifndef BAZ_H_INCLUDED > > #define BAZ_H_INCLUDED > > #include <ruby.h> > > VALUE cFoo; > > VALUE cBar; > > #endif > > This is a pretty standard C technique: > > in baz.h: > > #ifndef BAZ_H_INCLUDED > #define BAZ_H_INCLUDED > #include <ruby.h> > //these lines just say that these variables exist > extern VALUE cFoo; > extern VALUE cBar; > #endif > > in *one* of your .c files (presumably baz.c) > > //these lines declare memory for these variables > //and need to appear exactly once in your project > VALUE cFoo; > VALUE cBar; Ken, Joel, Thanks. I don't know why, but I had it in my head that I didn't have to extern the values. Regards, Dan
|
Pages: 1 Prev: Array index question Next: class ExistingName |