Hi,
I checked out revision 1911 and reproduced the procedure. It works!
Thank you.
-- Kobayashi, Tomoyas
(2014/02/17 21:36), David Matthews wrote:
Hi, That seems very reasonable. I've applied a slightly modified version of this and committed it. I haven't tested it so if you have a chance I'd be glad if you can confirm that it works.
Regards, David
On 14/02/2014 16:38, Kobayashi, Tomoyas wrote:
Hi,
Although Poly/ML has nice interface for calling C functions, it only supports dynamic linking. http://www.polyml.org/docs/CInterface.html
This is not pleasant if you want to distribute a program as a simple stand-alone executable. (setting the library path might be crumsy for the user)
A solution would be 'linking statically but loading dynamically.' Actually, dlopen seems to support this if the filename argument is NULL.
The following experiment (on Ubuntu 13.04 x86_64) seems to have succeeded, but needs a little modification to Poly/ML. How do you think? Any chance for Poly/ML to incorporate something similar?
Best regards, -- KOBAYASHI, Tomoyas
===== patch =====
--- foreign.cpp.orig 2014-02-15 00:29:32.334802335 +0900 +++ foreign.cpp 2014-02-15 00:35:58.362818505 +0900 @@ -742,7 +742,7 @@ return res;
#else /* UNIX version */
- void *lib = dlopen(name,DLOPENFLAGS);
- void *lib = dlopen(*name == 0 ? NULL : name,DLOPENFLAGS); if (!lib) { char buf[256];
===== experiment session =====
$ cat difference.c int difference (int x, int y) { return x > y ? x - y : y - x; } $ gcc -c difference.c -fPIC -o difference.o $ cat diff.sml local open CInterface in
fun diff (n, m) = let val lib = load_lib "" val sym = load_sym lib "difference" val diff' = call2 sym (INT, INT) INT in diff' (n, m) end
fun main () = print (Int.toString (diff (13, 50)) ^ "\n");
end $ poly Poly/ML 5.5.2 Testing
use "diff.sml";
val diff = fn: int * int -> int val main = fn: unit -> unit val it = (): unit
PolyML.export("diff.o", main);
val it = (): unit
$ gcc -L ~/poly/lib -rdynamic diff.o difference.o -lpolymain -lpolyml -lstdc++ -lm -ldl -lpthread -lgmp $ ./a.out 37 $
polyml mailing list polyml at inf.ed.ac.uk http://lists.inf.ed.ac.uk/mailman/listinfo/polyml