Thank you very much for your answer, again. I tried what you did and it works. The problem is that the project I try to interface is much more complicated than this (and I cannot modify it) but still it helps.
I will try to do the same thing with the real class GRelation. But for this, I need to use another C compiler than the standard one (I have to use the last version of gcc) and to modify the passed options (not only add some). I read documentation about defsystem but I didn't find how to do it ? Could you please tell me where I could find that information ? Best regards, Sascha Van Cauwelaert Le 24 nov. 2011 à 20:55, Martin Simmons a écrit : > I've tried to replicate what you are doing, by adding the following hacks to > your function in a file called gtest.cpp: > > #include <iostream> > #include <sstream> > #include <string> > > class GRelation { > private: > int _arity; > public: > int arity() { return _arity; }; > GRelation(int arity) { _arity = arity; }; > }; > > std::ostream& operator<<(std::ostream& out, GRelation &g) > { > out << "<GRelation" << g.arity() << ">"; > return out; > }; > > I then passed it through SWIG 1.3.31: > > swig -cffi -c++ -module gtestswig gtest.cpp > cat gtest.cpp gtest_wrap.cxx > gtest_code_and_wrap.cpp > > Beware that I've not read much C++ or SWIG documentation, so the above might > be somewhat bogus! > > Following that, it ran without errors with CFFI 0.10.6 on Mac OS X 10.6.8 like > this: > > (asdf:initialize-source-registry > '(:source-registry > (:directory "~/cffi_0.10.6") > (:directory "~/alexandria") > (:directory "~/babel_0.3.0") > (:directory "~/trivial-features_0.1") > :inherit-configuration)) > (asdf:load-system :cffi) > (compile-file "gtestswig" :load t) > (defsystem gtestswig (:c-default-options "-lstdc++") > :members (("gtest_code_and_wrap.cpp" :type :c-file))) > (compile-system 'gtestswig :force t :load t) > (test) > > -- > Martin Simmons > LispWorks Ltd > http://www.lispworks.com/ > > > > >>>>>> On Wed, 23 Nov 2011 16:20:51 +0100, Sascha Van Cauwelaert said: >> >> Thank you for your answer. >> >> Actually, I have an additional clue, which make me think that it is not >> related with garbage collection. If, in Lispworks, I use a wrapped function >> on the pointer to the C object (e.g. to get the arity), it works fine ! >> >> It seems that I just can't call a function which print some information >> about the object in a C++ function, wrapped to be used in LispWorks ... If I >> do it, I get the error : >> >> lispworks-personal-6-0-1-macos-universal(49641,0xb0314000) malloc: *** error >> for object 0x17bfc0f8: pointer being freed was not allocated >> *** set a breakpoint in malloc_error_break to debug >> >> I don't get how it can work in SBCL and not in LispWorks, and I have no clue >> because I don't know the internal implementation of LispWorks. >> >> I would really appreciate a little bit of your help. >> >> Regards, >> >> Sascha Van Cauwelaert >> >> >> Le 22 nov. 2011 à 21:16, Martin Simmons a écrit : >> >>>>>>>> On Mon, 21 Nov 2011 10:28:56 +0100, Sascha Van Cauwelaert said: >>>> >>>> Hello everybody, >>>> >>>> I am using SWIG to generate CFFI code to be used into LispWorks 6. The >>>> interface is between C++ and Common Lisp. Then, I try to call that function >>>> from LispWorks : >>>> >>>> std::string test() { >>>> freopen ("/tmp/mystdout.txt","w",stdout); >>>> freopen ("/tmp/mystderr.txt","w",stderr); >>>> std::cout << "Redirected stdout." << std::endl; >>>> std::cerr << "Redirected stderr." << std::endl; >>>> >>>> GRelation testgr(3); >>>> >>>> std::cout << "test ! " << std::endl; >>>> std::cerr << "test cerr! " << std::endl; >>>> std::cout << testgr.arity() << std::endl; >>>> std::cerr << testgr.arity() << std::endl; >>>> std::cout << "test after! " << std::endl; >>>> std::cerr << "test cerr after! " << std::endl; >>>> std::stringstream os; >>>> os << testgr << std::endl ; >>>> return os.str(); >>>> } >>>> >>>> As you can see, I just create one object and print lots of stuff, including >>>> an object attribute. Everything I print before trying to print the >>>> attribute >>>> prints ok in the redirected outputs. The attribute is not printed and >>>> nothing else afterwards. I also get the following error when I add testgr >>>> to >>>> the stringstream os : >>>> >>>> lispworks-personal-6-0-1-macos-universal(52881,0xb0314000) malloc: *** >>>> error for object 0x17be20f8: pointer being freed was not allocated >>>> >>>> This is what happen in LispWorks. If I compile directly in C++, no >>>> problem. If I use SBCL (other Common Lisp implementation) instead of >>>> LispWorks, everything works correctly ! The problem is that I have to use >>>> LispWorks ... >>>> >>>> Does anybody has had a similar problem ? I guess I am not the only one who >>>> tried to call some C++ from LispWorks. Any clue is very welcome. I think >>>> maybe the problem can be linked to the garbage collection from LispWorks >>>> but >>>> I don't know much about this. >>>> >>>> I thank you in advance for your help, I am really stuck here. >>> >>> I don't see how garbage collection can cause it, because malloc is not >>> affected by the LispWorks GC (unless something is doing bad things with >>> finalization routines). >>> >>> -- >>> Martin Simmons >>> LispWorks Ltd >>> http://www.lispworks.com/ >>> >>> _______________________________________________ >>> cffi-devel mailing list >>> cffi-devel@common-lisp.net >>> http://lists.common-lisp.net/cgi-bin/mailman/listinfo/cffi-devel >> > > _______________________________________________ > cffi-devel mailing list > cffi-devel@common-lisp.net > http://lists.common-lisp.net/cgi-bin/mailman/listinfo/cffi-devel _______________________________________________ cffi-devel mailing list cffi-devel@common-lisp.net http://lists.common-lisp.net/cgi-bin/mailman/listinfo/cffi-devel