[gecode-users] Extending the flatzinc interface

Guido Tack tack at gecode.org
Thu May 10 10:35:41 CEST 2012


Hi,

you are running into these problems because I didn't really take care that the registry can be extended by users - sorry about that.  I'll put the helper functions in a header so you can include them.  The linker problems are due to missing export declarations.  You can probably work around that problem by compiling Gecode with the --disable-gcc-visibility configure switch.  I'll also fix that.

Cheers,
Guido

On 7 May 2012, at 21:58, Jean-Noël Monette wrote:

> Hello,
> 
> I would like to extend the Gecode/Flatzinc interface to handle "natively" more constraints (that I implemented in Gecode). The way I do it is to add new constraints to the Registry global object. So my code looks like:
> 
> #include <gecode/flatzinc.hh>
> #include <gecode/flatzinc/registry.hh>
> #include "my_cstr_prop.hh"
> 
> namespace Gecode { namespace FlatZinc {
> 
> void p_my_cstr(FlatZincSpace& s, const ConExpr& ce, AST::Node* ann) {
>      IntVar x = getIntVar(s, ce[0]);
>      IntVar y = getIntVar(s, ce[1]);
>      My_CSTR(s,x,y,ann2icl(ann));
>    }
> 
> class MyPoster {
>   public:
>   MyPoster(void) {
>       registry().add("my_cstr", &p_my_cstr);
>   }
> };
> MyPoster __my_poster;
> }}
> 
> This is done by "monkey-see-monkey-do" from the file registry.cpp. However, I ran into several problems. First, I had to add the definition of "getIntVar" and "ann2icl", that I just copy-pasted from registry.cpp (as they are not declared in a header file, and furthermore are in an anonymous namespace). So, my question is to know if this is the way I'm suppose to do it, or if there is a more straightforward way to extend the Gecode/Flatzinc interface with new constraints.
> 
> 
> Second (this might be more related to c++ rather than Gecode, apologizes if this is indeed the case), I've been unable to link the resulting object file against libgecodeflatzinc.so with the following command (fz.o is the object file from fz.cpp in the gecode distrib):
> 
> g++   ./src_c/fz.o ./src_c/my_cstr.o   -lgecodeflatzinc -lgecodedriver -lgecodesearch -lgecodeminimodel -lgecodeset -lgecodeint -lgecodekernel -lgecodesupport
> 
> It yields the following error:
> 
> ./src_c/my_cstr.o: In function `global constructors keyed to _Z3NEQN6Gecode4HomeENS_6IntVarES1_NS_11IntConLevelE':
> my_cstr.cpp:(.text+0x2667): undefined reference to `Gecode::FlatZinc::registry()'
> my_cstr.cpp:(.text+0x2679): undefined reference to `Gecode::FlatZinc::Registry::add(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void (*)(Gecode::FlatZinc::FlatZincSpace&, Gecode::FlatZinc::ConExpr const&, Gecode::FlatZinc::AST::Node*))'
> 
> However, I'm able to link the same object file against the object files that are compiled into libgecodeflatzinc:
> 
> g++  ./src_c/fz.o ./src_c/my_cstr.o  gecode-3.7.3/gecode/flatzinc/*.o -lgecodedriver -lgecodesearch -lgecodeminimodel -lgecodeset -lgecodeint -lgecodekernel -lgecodesupport
> 
> So, I'm wondering why and how this is happening, and I have no clue... (I'm using Gecode 3.7.1, compiler is gcc 4.5.2, on Ubuntu 11.04)
> 
> Thank you very much for your help,
> 
> Jean-Noël Monette
> 
> 
> _______________________________________________
> Gecode users mailing list
> users at gecode.org
> https://www.gecode.org/mailman/listinfo/gecode-users

-- 
Guido Tack,
http://www.csse.monash.edu/~guidot/



-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.gecode.org/pipermail/users/attachments/20120510/24e0f127/attachment.html>


More information about the users mailing list