2016-08-05 2 views
1

プラグインとして使用するためにdllにコンパイルする必要があるSqueakから生成された.cファイルがありますが、私はその方法はわかりません。私はインターネットを検索しようとしましたが、私が見つけることができるのは、dllにc#とC++をコンパイルする方法に関する情報です。生成されたコードは次のとおりです。c-codeをダイナミックリンクライブラリにコンパイル

/* Automatically generated from Squeak on (13 July 2016 9:46:45 pm) */ 

#if defined(WIN32) || defined(_WIN32) || defined(Win32) 
#ifdef __cplusplus 
    #define DLLEXPORT extern "C" __declspec(dllexport) 
#else 
    #define DLLEXPORT __declspec(dllexport) 
#endif /* C++ */ 
#else 
#define DLLEXPORT 
#endif /* WIN32 */ 

#include "sqVirtualMachine.h" 

/* memory access macros */ 
#define byteAt(i) (*((unsigned char *) (i))) 
#define byteAtput(i, val) (*((unsigned char *) (i)) = val) 
#define longAt(i) (*((int *) (i))) 
#define longAtput(i, val) (*((int *) (i)) = val) 

#include <string.h> 

/*** Variables ***/ 
struct VirtualMachine* interpreterProxy; 
const char *moduleName = "TestPlugin 13 July 2016 (e)"; 

/*** Functions ***/ 
DLLEXPORT int primitiveAdd(void); 
DLLEXPORT int primitiveFetchString(void); 
DLLEXPORT int setInterpreter(struct VirtualMachine* anInterpreter); 

DLLEXPORT int primitiveAdd(void) { 
    int operand1; 
    int operand2; 
    int result; 

    operand1 = interpreterProxy->stackIntegerValue(1); 
    operand2 = interpreterProxy->stackIntegerValue(0); 
    if (interpreterProxy->failed()) { 
     return 0; 
    } 
    result = operand1 + operand2; 
    interpreterProxy->popthenPush(3, ((result << 1) | 1)); 
    return 0; 
} 

DLLEXPORT int primitiveFetchString(void) { 
    int in; 
    int i; 
    int count; 
    int resultOop; 
    char* src; 
    char* dst; 
    char s0[] = "zero"; 
    char s1[] = "non-zero"; 

    in = interpreterProxy->stackIntegerValue(0); 
    if (interpreterProxy->failed()) { 
     return 0; 
    } 
    if (in == 0) { 
     src = s0; 
    } else { 
     src = s1; 
    } 
    count = strlen(src); 
    resultOop = interpreterProxy->instantiateClassindexableSize(interpreterProxy->classString(), count); 
    dst = ((char *) (interpreterProxy->firstIndexableField(resultOop))); 
    for (i = 0; i <= (count - 1); i += 1) { 
     dst[i] = (src[i]); 
    } 
    interpreterProxy->popthenPush(2, resultOop); 
    return 0; 
} 

DLLEXPORT int setInterpreter(struct VirtualMachine* anInterpreter) { 
    int ok; 

    interpreterProxy = anInterpreter; 
    ok = interpreterProxy->majorVersion() == VM_PROXY_MAJOR; 
    if (ok == 0) { 
     return 0; 
    } 
    ok = interpreterProxy->minorVersion() >= VM_PROXY_MINOR; 
    return ok; 
} 

注:これは単なるTestPluginコードです。私は実際には、このようなdllを構築して、すくい声でゆっくりと実行する私のくすんだコードの領域をスピードアップします。

答えて

1

最初の停止はOpenSmalltalk virtual machine repositoryである必要があります。リポジトリには、仮想マシンとそのプラグインのコンパイル方法に関する包括的なドキュメントが含まれています。仮想マシンでプラグインを配布したい場合、これはおそらく必要なものです。

一方、プラグインをコンパイルしてプラグインディレクトリにコピーするだけで済みます。 VMは要求に応じてプラグインをロードしようとし、プラグインのディレクトリが検索パスにあるため、そのプラグインを見つけることができます。プラグインを自分でコンパイルするには、ビルドツールチェインが必要です。これは、共有ライブラリを生成するもの(Visual Studio、XCode、autotoolsなど)です。

あなたが心に留めておく必要があるいくつかのものがあります:共有として

  1. はコンパイルとユニバーサル
  2. は、C++の場合は、32ビット
  3. にコンパイル:
  4. をマングリングネームを防ぐために、シンボルをエクスポート

ビルドスクリプトの複雑さは、コンパイルするライブラリによって異なります。 VMコンパイル時に生成されるプラグインのかなり複雑なビルドスクリプト(ウィンドウ用)では、PharoVMで使用されるCMake script for libgit2をチェックアウトすることができます。

残念ながら、共有ライブラリのコンパイルには何もありません。ライブラリとそのユーザの要件が変わると、ビルドプロセスとその複雑さも変わります。これは、依存関係(pkg-configを使用して必要なライブラリの共通インストールパスを検索する場合など)に特に当てはまります。しかし、あなたのコードから判断すると、大きな問題ではないはずです。私のお勧め:あなたのプラグイン用にCMakeスクリプトを作成する時間を取ってください。コンパイラを手作業で実行するよりも難しいかもしれませんが、コンパイルの実行方法に関するドキュメントとして役立ち、別のプラットフォームでコンパイルする必要がある場合は大きな助けになります。

関連する問題