export CC="gcc -fpic -DPIC -DLIBSINGULAR" export CXX="g++ -fpic -DPIC -DLIBSINGULAR" ./configure or ./configure --without-dynamic-kernel make install-libsingular --------------------------------------- how to compile and run the the example: g++ -I......include -o tt tt.cc -L..../Singular -lsingular export SINGULAR="..../Singular-3-1-3/" export SINGULAR_SYSTEM_TYPE="ix86Mac-darwin/lib" if [ "${SINGULAR_SYSTEM_TYPE}" = "ix86Mac-darwin/lib" ]; then export DYLD_LIBRARY_PATH="${SINGULAR}/${SINGULAR_SYSTEM_TYPE}:${DYLD_LIBRARY_PATH}" else export LD_LIBRARY_PATH="${SINGULAR}/${SINGULAR_SYSTEM_TYPE}:${LD_LIBRARY_PATH}" fi unset SINGULAR_SYSTEM_TYPE ./tt -------------------------------------- the example: #include main() { // init path names etc. siInit((char *)"/...Singular-3-1-3/Singular/libsingular.so"); // construct the ring Z/32003[x,y,z] // the variable names char **n=(char**)omalloc(3*sizeof(char*)); n[0]=omStrDup("x"); n[1]=omStrDup("y"); n[2]=omStrDup("z2"); ring R=rDefault(32003,3,n); // make R the default ring: rChangeCurrRing(R); // create the polynomial 1 poly p1=p_ISet(1,R); // create tthe polynomial 2*x^3*z^2 poly p2=p_ISet(2,R); pSetExp(p2,1,3); pSetExp(p2,3,2); pSetm(p2); // print p1 + p2 pWrite(p1); printf(" + \n"); pWrite(p2); printf("\n"); // compute p1+p2 p1=p_Add_q(p1,p2,R); p2=NULL; pWrite(p1); // clean up: pDelete(&p1); rKill(R); currentVoice=feInitStdin(NULL); // hook for error handling: // WerrorS_callback=......; of type p(const char *) int err=iiAllStart(NULL,"int ver=system(\"version\");\n",BT_proc,0); if (err) errorreported = 0; // reset error handling printf("interpreter returns %d\n",err); idhdl h=ggetid("ver"); if (h!=NULL) printf("singular variable ver of type %d contains %d\n",h->typ,(int)(long)IDDATA(h)); else printf("variable ver does not exist\n"); // calling a singular-library function idhdl datetime=ggetid("datetime"); if (datetime==NULL) printf("datetime not found\n"); else { leftv res=iiMake_proc(datetime,NULL,NULL); if (res==NULL) { printf("datetime return an error\n"); errorreported = 0; } else printf("datetime returned type %d, >>%s<<\n",res->Typ(),(char *)res->Data()); } // changing a ring for the interpreter // re-using n and R from above R=rDefault(32003,3,n); idhdl newRingHdl=enterid("R" /* ring name*/, 0, /*nesting level, 0=global*/ RING_CMD, &IDROOT, FALSE); IDRING(newRingHdl)=R; // make R the default ring (include rChangeCurrRing): rSetHdl(newRingHdl); err=iiAllStart(NULL,"poly p=x;listvar();return();\n"),BT_Proc,0); // calling a kernel function via the interpreter interface sleftv r1; memset(&r1,0,sizeof(r1)); sleftv arg; memset(&arg,0,sizeof(r1)); arg.rtyp=STRING_CMD; arg.data=omStrDup("huhu"); err=iiExprArith1(&r1,&arg,TYPEOF_CMD); printf("interpreter returns %d\n",err); if (err) errorreported = 0; // reset error handling else printf("typeof returned type %d, >>%s<<\n",r1.Typ(),r1.Data()); // clean up r1: r1.CleanUp(); }