2016-08-05 2 views
1

У меня есть .c файл, сгенерированный из Squeak, который мне нужно скомпилировать в DLL для использования в качестве плагина, но я не знаю, как это сделать. Я пробовал поиск в Интернете, но все, что я могу найти, это информация о том, как скомпилировать C# и C++ в dll. Код, который был сгенерирован, выглядит следующим образом:Компиляция c-кода в библиотеку Dynamic-Link

/* 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. компиляции 32-битных
  3. в случае C++: экспортировать символы, чтобы предотвратить имя коверкая

Сложность сценария сборки зависит от библиотеки, которую вы хотите скомпилировать. Для довольно сложного скрипта сборки (для окон) плагина, сгенерированного во время компиляции VM, вы можете проверить CMake script for libgit2, используемый PharoVM.

К сожалению, нет серебряной пули для общей сборника библиотек. По мере изменения требований библиотеки и ее пользователей, так же как и процесс сборки и ее сложность. Это особенно верно для зависимостей (например, при использовании pkg-config для поиска общих путей установки для требуемых библиотек). Однако, судя по вашему кодексу, я думаю, что это не должно быть большой проблемой. Моя рекомендация: найдите время для создания сценария CMake для своего плагина. Это может быть сложнее, чем запуск компилятора вручную, но он служит документацией о том, как выполнить компиляцию, и будет большой помощью, если вам когда-либо понадобится компиляция на или для другой платформы.