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@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

Reply via email to