From: Thorsten Hater
Date: 2009-12-22T22:19:24+09:00
Subject: Re: [ANN] rb++ / rbgccxml 0.9.1
Well, actually it shouldn't be included more than one time due
to the header guard.
But, you're correct having method definitions in headers is not
good style, so I decided to go the second route. Now ruby claims
that the symbol test is undefined.
Depending on the sources array, I get:
hpp --> undefined symbol
hpp + cpp --> double definition
cpp --> double definition
I am doing something really stupid here, or is there a way to rb++
to treat hpp + cpp as a package?
Thorsten
Jason Roelofs wrote:
> What you're running into is a general C++ compilation issue when you have
> code in your header files. By default, rb++ writes out code in a
> one-file-per-class format, along with another file that's the ruby extension
> starting point. Your test.hpp file ends up getting included into multiple
> files, and g++ doesn't like it when it sees a fully defined method multiple
> times.
>
> Two ways to deal with this:
>
> 1) Tell rb++ to write all code to single file:
>
> ext.writer_mode :single
>
> 2) Split your C++ code out:
>
> test.hpp
> namespace T { void test(); }
>
> test.cpp
> namespace T { void test() { ... } }
>
> Jason
>
> On Fri, Dec 18, 2009 at 9:02 AM, Thorsten Hater | wrote:
>
>
>> Hi,
>>
>> I seem to have something like a bug in rb++. For the case that I want to
>> wrap a simple method
>> the extension doesn't compile because of multiple definitions. The issue
>> is somewhat tricky since
>> when I have a previously compiled extension and merely extend the header
>> file, it compiles fine.
>> Here test case:
>>
>> wrapper.rb
>> require 'rubygems'
>> require 'rbplusplus'
>>
>> include RbPlusPlus
>>
>> Extension.new "test" do |ext|
>> ext.sources ["/home/thor/rb++/test.hpp"]
>>
>> ext.module "Test" do |mod|
>> node = mod.namespace "T"
>> end
>> end
>>
>> test.hpp
>> #ifndef TEST
>> #define TEST
>>
>> #include
>>
>> namespace T
>> {
>>
>> void test()
>> {
>> std::cout << "i'm just sitting here" << std::endl;
>> }
>>
>> }
>> #endif
>>
>> The error is encountered also if I have a class before the function test.
>>
>> Thorsten
>>
>>
>> Jason Roelofs wrote:
>>
>>> What is rb++ / rbgccxml?
>>>
>>> Rb++, rbgccxml, and rice compose a suite of tools that make wrapping
>>>
>> C++
>>
>>> libraries into
>>> Ruby extensions as simple as possible. This is built as a replacement
>>>
>> for
>>
>>> SWIG-Ruby.
>>>
>>> What's New
>>>
>>> * Full 1.9 support through the entire stack!
>>> * MinGW / MSYS build support on Windows.
>>>
>>> rb++:
>>> * Updated to work with the Rice::Director changes
>>> * Fixed a bug where rb++ wasn't using any superclass on classes with
>>> multiple superclasses
>>> * Generated extension handles exceptions cleaner
>>>
>>> * Various other small bug fixes and tweaks
>>>
>>>
>>> rbgccxml:
>>> * Switched parsing from libxml-ruby to nokogiri
>>> * Fixed crash on encountering , but no real handling of the
>>>
>> type
>>
>>> yet.
>>> * Fixed a bug with older gcc versions on dealing with anonymous
>>> enumerations
>>>
>>>
>>> Project
>>>
>>> Documentation: http://rbplusplus.rubyforge.org
>>>
>>> rb++: http://github.com/jameskilton/rbplusplus
>>> rbgccxml: http://github.com/jameskilton/rbgccxml
>>>
>>>
>>> Installation
>>>
>>> This single command will grab the whole stack needed for rb++ to work.
>>>
>>> gem install rbplusplus
>>>
>>> The stack includes four libraries: rb++, rbgccxml, gccxml_gem, and rice
>>>
>>>
>>> rb++
>>>
>>> Rb++ makes it almost trivially easy to create Ruby extensions for C++
>>> library.
>>> In the simplest of cases, there is no need to ever touch C++,
>>>
>> everything
>>
>>> is done
>>> in a very simple and clean Ruby API.
>>>
>>>
>>>
>>> rbgccxml
>>>
>>> RbGCCXML allows one to easily parse out and query C / C++ code.
>>> This library uses GCC-XML to parse out the C / C++ code into XML, and
>>>
>> then
>>
>>> nokogiri
>>> to parse and query that XML.
>>>
>>>
>>>
>>> gccxml_gem
>>>
>>> GCC-XML (www.gccxml.org) is an application that takes takes the parse
>>>
>> tree
>>
>>> of C / C++
>>> and constructs a very parsable and queryable XML file with all related
>>> information.
>>>
>>> This gem includes a binary build of GCC-XML for supported platforms,
>>> to make it trivially easy to install. Platforms currently supported
>>>
>> are:
>>
>>> * Linux 32 & 64 bit
>>> * Mac OS X
>>> * Windows via MinGW / MSYS
>>>
>>>
>>> Rice
>>>
>>> The Ruby Interface for C++ Extensions, it provides a C++ API for
>>>
>> working
>>
>>> with ruby. More information
>>> available at its project page:
>>>
>>> http://rice.rubyforge.org
>>>
>>>
>>> Notes
>>>
>>> Released under the MIT licence.
>>>
>>> For those familiar with py++ / pygccxml, the similarities are in
>>>
>> function
>>
>>> only.
>>> Rb++ / rbgccxml were written from scratch to take advantage of the Ruby
>>> language to it's fullest.
>>>
>>> Bugs, patches, feature requests, et al should be posted to the
>>> corresponding project's Issues page on github.
>>>
>>>
>>>
>>
>>
>
>
|