1

emscripten を使用して、単純な HelloWorld プログラムを C++ から Javascript にコンパイルしようとしています。マルチ関数などを呼び出すメイン関数を含めると、正常に動作します。これが私のコードです(HelloWorld.cpp)。

#include <stdio.h>

class HelloWorld {
    public: void sayHello() {
        printf("Hello World Klasse! %f", multi(7));
    }

    public: double multi(double x){
        return x * x;
    }
};

ただし、メイン関数を含めない場合、emcc コンパイルは常に出力します

エラー ルート: 処理する機能がありません。LLVM がそれらをデッドとして排除しないようにしてください (必要に応じて EXPORTED_FUNCTIONS を使用してください。FAQ を参照してください)。

どの関数をコンパイル .js ファイルに含める必要があるかを示す「EXPORTED_FUNCTIONS」オプションについて知っています。私はさまざまなことを試しました:

  1. マングリング名を使用すると、これを理解している限り、名前は「_multi_d10HelloWorldd」である必要があります。また、クラス名と他のいくつかの組み合わせなしで試しました。

    emcc -s HelloWorld.cpp -s EXPORTED_FUNCTIONS='["_multi_d10HelloWorldd"]'
    
  2. 修飾子 EXPORT_ALL の使用

    emcc -s HelloWorld.cpp -s EXPORT_ALL=1
    

私が何をしても、関数は最終的な js ファイルに含まれません。

EMCC FAQから理解していることから、 EXPORTED_FUNCTIONSを使用する必要があるため、後で同じメソッド名を使用せずに JS から「sayHello」などの目的の関数を呼び出すことができます。そして、これはまさに私が後で行う必要があることです。

誰かが私が考えていなかったかもしれない解決策または他の可能なオプションを教えてもらえますか?

私が考えたマングリング名は正しいですか?

4

1 に答える 1

4

「extern c」ブロックを作成します。このブロック内で、JavaScript に公開する関数を定義します。これらの関数には、アンダースコアをプレフィックスとして付ける必要があります。これらの関数の 1 つの中で、C++ クラスをインスタンス化できます。

これは、動的ライブラリを作成する場合と同じアプローチであり、必要に応じてネイティブ プログラムでライブラリを再利用できるという利点があります。

于 2014-01-19T18:11:30.057 に答える