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