[英]How to pass string to OCaml from C++
我在谷歌上沒有找到任何關於此的內容,所以我正在回答我自己的問題:
如何將字符串從 C++ 傳遞給 OCaml?
給定 C++ 代碼,我如何調用 OCaml 代碼並傳遞該字符串?
也適用於 C,只需更改編譯指令:
say_something.ml:
let say_something string = String.concat "" ["OCaml says: "; string]
let () = Callback.register "say_something" say_something
say_something.cc:
#include <stdio.h>
#include <string.h>
#include <caml/mlvalues.h>
#include <caml/callback.h>
#include <caml/alloc.h>
char *say_something(const char *s)
{
static const value *say_something_closure = NULL;
if (say_something_closure == NULL) {
say_something_closure = caml_named_value("say_something");
if (say_something_closure == NULL) {
std::exit(1);
}
}
value str = caml_alloc_initialized_string(strlen(s), s);
/* We copy the C string returned by String_val to the C heap
so that it remains valid after garbage collection. */
return strdup(String_val(caml_callback(*say_something_closure, str)));
}
主.cc:
#include <stdio.h>
#include <caml/callback.h>
extern char* say_something(const char* s);
int main(int argc, char ** argv)
{
char* result;
/* Initialize OCaml code */
caml_startup(argv);
/* Do some computation */
result = say_something("hello world\n");
printf("%s", result);
return 0;
}
如何構建:
ocamlopt -output-obj -o s.o say_something.ml
g++ -o hello_world -I $(ocamlopt -where) \
main.cc say_something.cc s.o $(ocamlopt -where)/libasmrun.a -ldl
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.