Hello. What is the difference between (LoadLibrary "") and (loadExecutable ()) calls?
2018-09-10 17:53 GMT+03:00 Phil Clayton <phil.clay...@veonix.com>: > Slight correction: using an empty string for the library has the effect of > passing NULL to dlopen which means the handle passed to dlsym is the current > program. > > > On 10/09/18 15:29, Phil Clayton wrote: >> >> Hi Mark, >> >> > (* symbol lookup error: /usr/lib/x86_64-linux-gnu/libgsl.so: undefined >> > symbol: cblas_dgemm *) >> >> To avoid looking for the symbol "cblas_dgemm" in libgsl (which doesn't >> define it), you could let the dynamic linker look for it by using an empty >> string for the library which has the effect of passing RTLD_DEFAULT to >> dlsym. >> >> val gsl = loadLibrary ""; >> >> To make sure these libraries are searched, you would need to start your >> poly session with something like >> >> >> LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libgsl.so":"/usr/lib/x86_64-linux-gnu/libgslcblas.so >> \ >> poly >> >> which could be put into a wrapper script. Or you could build an >> executable (which could be a poly REPL) and link to them. >> >> Another advantage of this approach is portability. The SML code is more >> portable because shared object names and their paths vary across systems. >> Linking also avoids the problem of specifying the library names because you >> use flags such as -lgsl and the linker works it out. Linking can be done in >> an even more portable way using a utility like pkg-config to generate the >> linker arguments: >> >> pkg-config --libs gsl >> >> (This usual requires the -devel or -dev package for the library.) >> >> Regards, >> Phil >> >> >> On 09/09/18 21:15, Mark Clements wrote: >>> >>> I am enjoying using polyml's Foreign structure. >>> >>> However, in using the GNU Scientific Library (GSL), I have run into a >>> problem with linkage. The GSL library (libgsl.so) calls standard cBLAS >>> matrix functions with unknown symbols to allow the user to link with >>> different cBLAS implementations (NB: GSL provides an unoptimised cBLAS >>> implementation named libgslcblas.so). When I call a GSL function that >>> depends on the cBLAS functions, I get a symbol not defined error. >>> >>> I have tried unsuccessfully (a) loading the libgslcblas library either >>> before or after loading libgsl, (b) changing the loadLibrary >>> implementation to use dlopen with RTLD_LAZY | RTLD_GLOBAL, and (c) >>> compiling the SML code to an object file and then linking against the >>> libraries. >>> >>> How could this be made to work? >>> >>> Sincerely, Mark. >>> >>> PS test code for (a) is: >>> >>> open Foreign; >>> val gsl = loadLibrary "/usr/lib/x86_64-linux-gnu/libgsl.so"; >>> val gslcblas = loadLibrary "/usr/lib/x86_64-linux-gnu/libgslcblas.so"; >>> type gsl_matrix_t = Memory.voidStar; (* for demonstration only *) >>> local >>> val call1 = buildCall2((getSymbol gsl "gsl_matrix_calloc"), >>> (cInt,cInt), cPointer) >>> val call2 = buildCall4((getSymbol gsl "gsl_matrix_set"), >>> (cPointer,cInt,cInt,cDouble), cVoid) >>> val call3 = buildCall3((getSymbol gsl >>> "gsl_linalg_exponential_ss"), (cPointer, cPointer, cDouble), cVoid) >>> in >>> fun gsl_matrix_alloc (size1,size2) = call1(size1,size2) >>> fun gsl_matrix_set (ptr : gsl_matrix_t, i, j, x) = call2(ptr, i, j, x) >>> fun gsl_matrix (arr : real Array2.array) = >>> let >>> val size1 = Array2.nRows arr >>> val size2 = Array2.nCols arr >>> val ptr = gsl_matrix_alloc(size1, size2) >>> val _ = Array2.tabulate Array2.RowMajor (size1, size2, fn (i,j) => >>> gsl_matrix_set(ptr, i, j, Array2.sub(arr, i, j))) >>> in >>> ptr >>> end >>> fun gsl_mexp (arr : real Array2.array) = >>> let >>> val size1 = Array2.nRows arr >>> val size2 = Array2.nCols arr >>> val ptr = gsl_matrix arr >>> val ptr2 = gsl_matrix_alloc(size1, size2) >>> val _ = call3(ptr, ptr2, 0.01) >>> in >>> ptr2 >>> end >>> end; >>> fun main() = >>> let >>> val a = Array2.fromList [[1.0,2.0],[3.0,4.0]]; >>> val ptr = gsl_matrix(a); >>> val m = gsl_mexp(a) (* fails *) >>> in >>> () >>> end; >>> (* symbol lookup error: /usr/lib/x86_64-linux-gnu/libgsl.so: undefined >>> symbol: cblas_dgemm *) >>> >>> For (c): >>> >>> polyc -c test.sml >>> g++ test.o -L/usr/lib/x86_64-linux-gnu -lgsl -lgslcblas `pkg-config >>> --libs polyml` >>> ./a.out >>> # same error >>> _______________________________________________ >>> polyml mailing list >>> polyml@inf.ed.ac.uk >>> http://lists.inf.ed.ac.uk/mailman/listinfo/polyml >>> >> _______________________________________________ >> polyml mailing list >> polyml@inf.ed.ac.uk >> http://lists.inf.ed.ac.uk/mailman/listinfo/polyml >> > _______________________________________________ > polyml mailing list > polyml@inf.ed.ac.uk > http://lists.inf.ed.ac.uk/mailman/listinfo/polyml _______________________________________________ polyml mailing list polyml@inf.ed.ac.uk http://lists.inf.ed.ac.uk/mailman/listinfo/polyml