You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@thrift.apache.org by Mina Naguib <mi...@bloomdigital.com> on 2010/08/27 18:55:22 UTC
CPP generator's code will not compile under autoconf
Hi folks
I'm running into a peculiar issue with compiling the code outputted by the thrift CPP generator.
Currently using thrift 0.4 against the cassandra 0.6.4 interface file, but I believe the problem isn't related to a particular version of either (or cassandra at all).
Once the thrift generator is run, the following compiles nicely:
$ g++ -I/usr/local/thrift_04/include/thrift -I/opt/local/include -c gen-cpp/cassandra_constants.cpp -o gen-cpp/cassandra_constants.o
However, I'm working on a piece of software (libcassandra) which itself uses autotools. That means the compile line is very large, however the breakage happens specifically when -DHAVE_CONFIG_H is added:
$ g++ -DHAVE_CONFIG_H -I/usr/local/thrift_04/include/thrift -I/opt/local/include -c gen-cpp/cassandra_constants.cpp -o gen-cpp/cassandra_constants.o
In file included from gen-cpp/cassandra_constants.cpp:6:
gen-cpp/cassandra_constants.h:17: error: expected unqualified-id before string constant
gen-cpp/cassandra_constants.cpp: In constructor ‘org::apache::cassandra::cassandraConstants::cassandraConstants()’:
gen-cpp/cassandra_constants.cpp:13: error: assignment of read-only location
gen-cpp/cassandra_constants.cpp:13: error: invalid array assignment
The offending line is gen-cpp/cassandra_constants.h:17:
std::string VERSION;
It's syntactically correct, however:
* That file includes gen-cpp/cassandra_types.h
* Which includes Thrift.h
* Which, if HAVE_CONFIG is defined, includes config.h
* which does: #define VERSION "0.4.0"
The end result is that the defined VERSION is substituted, causing the generated code to actually be syntactically invalid:
std::string "0.4.0";
To work-around the issue, I've edited gen-cpp/cassandra_constants.h, and removed its include of gen-cpp/cassandra_types.h, which lead to requiring include <strong>. I suppose another option is to #undef VERSION
Once that was done, the rest of the files compiled nicely, and the final library and program ran well.
It's inevitably a hack though, as the next time the code is re-generated from the interface the same manual editing would need to be done. I'm also unsure if this is a bug per-se, or I'm doing something completely wrong w.r.t. my use of autotools in libcassandra. Ideas are very welcome.
Re: CPP generator's code will not compile under autoconf
Posted by David Reiss <dr...@facebook.com>.
> Ideas are very welcome.
Don't name a constant "VERSION"? I know it might not sound very satisfying,
but this is not really a problem with Thrift.h. Any macro defined by any
file you include before cassandra_constants can conflict with a symbol used
in that file.
That said, I think there might be a way to configure autoheader to use
a symbol like THRIFT_VERSION instead of just VERSION. I'm not sure what
it is, though.
--David
On 08/27/2010 09:55 AM, Mina Naguib wrote:
>
> Hi folks
>
> I'm running into a peculiar issue with compiling the code outputted by the thrift CPP generator.
>
> Currently using thrift 0.4 against the cassandra 0.6.4 interface file, but I believe the problem isn't related to a particular version of either (or cassandra at all).
>
> Once the thrift generator is run, the following compiles nicely:
> $ g++ -I/usr/local/thrift_04/include/thrift -I/opt/local/include -c gen-cpp/cassandra_constants.cpp -o gen-cpp/cassandra_constants.o
>
> However, I'm working on a piece of software (libcassandra) which itself uses autotools. That means the compile line is very large, however the breakage happens specifically when -DHAVE_CONFIG_H is added:
>
> $ g++ -DHAVE_CONFIG_H -I/usr/local/thrift_04/include/thrift -I/opt/local/include -c gen-cpp/cassandra_constants.cpp -o gen-cpp/cassandra_constants.o
> In file included from gen-cpp/cassandra_constants.cpp:6:
> gen-cpp/cassandra_constants.h:17: error: expected unqualified-id before string constant
> gen-cpp/cassandra_constants.cpp: In constructor ‘org::apache::cassandra::cassandraConstants::cassandraConstants()’:
> gen-cpp/cassandra_constants.cpp:13: error: assignment of read-only location
> gen-cpp/cassandra_constants.cpp:13: error: invalid array assignment
>
> The offending line is gen-cpp/cassandra_constants.h:17:
> std::string VERSION;
>
> It's syntactically correct, however:
> * That file includes gen-cpp/cassandra_types.h
> * Which includes Thrift.h
> * Which, if HAVE_CONFIG is defined, includes config.h
> * which does: #define VERSION "0.4.0"
>
> The end result is that the defined VERSION is substituted, causing the generated code to actually be syntactically invalid:
> std::string "0.4.0";
>
> To work-around the issue, I've edited gen-cpp/cassandra_constants.h, and removed its include of gen-cpp/cassandra_types.h, which lead to requiring include <strong>. I suppose another option is to #undef VERSION
>
> Once that was done, the rest of the files compiled nicely, and the final library and program ran well.
>
> It's inevitably a hack though, as the next time the code is re-generated from the interface the same manual editing would need to be done. I'm also unsure if this is a bug per-se, or I'm doing something completely wrong w.r.t. my use of autotools in libcassandra. Ideas are very welcome.