2012-01-26 13 views
5

Sau khi làm theo hướng dẫn trên emscripten wiki Tôi đã quản lý để biên dịch một thư viện C nhỏ. Điều này dẫn đến tệp a.out.js.Sử dụng thư viện C đã soạn thảo emscripten từ node.js

tôi đã giả định rằng để sử dụng chức năng từ thư viện này (trong vòng Node.js) một cái gì đó như thế này sẽ làm việc:

var lib = require("./a.out.js"); 
lib.myFunction('test'); 

Tuy nhiên điều này không thành. Bất cứ ai có thể giúp đỡ hoặc chỉ cho tôi một số hướng dẫn cơ bản liên quan đến điều này?

Trả lời

7

Vấn đề ở đây là các tập tin a.out.js của bạn sẽ trông như thế này

function myFunction() { 
    ... 
} 

Không thích này

function myFunction() { 
    ... 
} 

exports.myFunction = myFunction; 

Bạn cần phải viết một kịch bản build liệt kê các thẻ bạn muốn công khai xuất từ ​​mỗi chương trình C và nối thêm exports.<token> = <token>;\n vào cuối tệp của bạn cho mỗi mã thông báo.

+1

Sau một số nghiên cứu, tôi đã tìm thấy giải pháp trên trang wiki emstten '[Tương tác với mã] (https://github.com/kripken/emscripten/wiki/Interacting-with-code) ', Kết hợp các ** xuất khẩu. ** với chức năng ** Pointer_stringify ** và ** allocate ** thực hiện công việc – lostsource

+0

@lostsource bạn có thể cho tôi xem ví dụ không? – noamtcohen

6

Thực tế, tất cả các chức năng đã được xuất. Tạo JavaScript chứa dòng sau:

var ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function'; 
// … 

if (ENVIRONMENT_IS_NODE) { 
    // … 
    module['exports'] = Module; 
} 

Nếu bạn có một chức năng gọi là my_fun trong mã C của bạn, sau đó bạn sẽ phải Module._my_fun xác định.

Tuy nhiên, có một số vấn đề với phương pháp này.

Trình tối ưu hóa có thể xóa hoặc đổi tên một số chức năng, vì vậy hãy luôn chỉ định chúng đi qua -s EXPORTED_FUNCTIONS="['_main','_fun_one','_fun_two']". Chữ ký chức năng trong C++ có chút bị xáo trộn, do đó, nó là khôn ngoan để extern "C" { … } những cái mà bạn muốn xuất.

Hơn nữa, cách tiếp cận trực tiếp như vậy requires JS to C type conversions. Bạn có thể muốn giấu nó bằng cách thêm một lớp API trong tập tin thêm vào kèm theo --pre-js tùy chọn:

var Module = { 
    my_fun: function(some_arg) { 
    javascript to c conversion goes here; 
    Module._my_fun(converted_arg) // or with Module.ccall 
    } 
} 

Module đối tượng sau sẽ được tăng cường bởi tất cả các goodies Emscripten tạo ra, do đó, không lo lắng rằng nó được định nghĩa ở đây , không được sửa đổi.

Cuối cùng, bạn chắc chắn sẽ muốn xem xét Embind là cơ chế để hiển thị các API JavaScript tốt được cung cấp bởi Emscripten. (Yêu cầu tắt phụ trợ fastcomp mới nhất.)

Các vấn đề liên quan