From: Ken Bloom Date: 2010-02-26T05:08:39+09:00 Subject: Re: Making a VALUE visible to multiple source files Daniel Berger 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 > VALUE cFoo; > VALUE cBar; > #endif This is a pretty standard C technique: in baz.h: #ifndef BAZ_H_INCLUDED #define BAZ_H_INCLUDED #include //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; -- Chanoch (Ken) Bloom. PhD candidate. Linguistic Cognition Laboratory. Department of Computer Science. Illinois Institute of Technology. http://www.iit.edu/~kbloom1/