gpt4 book ai didi

将 C 代码编译为动态链接库

转载 作者:太空宇宙 更新时间:2023-11-04 03:28:56 25 4
gpt4 key购买 nike

我有一个从 Squeak 生成的 .c 文件,我需要将其编译为 dll 以用作插件,但我不知道如何操作。我曾尝试在互联网上搜索,但我所能找到的只是有关如何将 c# 和 c++ 编译为 dll 的信息。生成的代码如下:

/* 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,以加快我的 squeak 代码中运行缓慢的区域。

最佳答案

您的第一站应该是 OpenSmalltalk virtual machine repository .该存储库包含有关如何编译虚拟机及其插件的综合文档。如果您想使用虚拟机分发您的插件,那么这可能就是您所需要的。

另一方面,您可以简单地自己编译插件并将其复制到插件目录。 VM 将根据请求尝试加载插件,并且可以找到它,因为插件目录位于其搜索路径中。要自己编译插件,您需要一个构建工具链。这可以是生成共享库的任何东西(Visual Studio、XCode、autotools 等)。

有几点需要注意:

  1. 编译为共享和通用
  2. 编译成 32 位
  3. 对于 C++:导出符号以防止名称混淆

构建脚本的复杂性取决于您要编译的库。对于在 VM 编译期间生成的相当复杂的插件构建脚本(适用于 Windows),您可以查看 CMake script for libgit2由 PharoVM 使用。

不幸的是,共享库编译没有 Elixir 。随着图书馆及其用户的需求发生变化,构建过程及其复杂性也会发生变化。对于依赖项尤其如此(例如,当使用 pkg-config 搜索所需库的通用安装路径时)。但是,从您的代码来看,我认为这应该不是什么大问题。我的建议:花时间创建一个 CMake插件的脚本。它可能比手动运行编译器更难,但它可以作为有关如何执行编译的文档,如果您需要在另一个平台上或为另一个平台进行编译,这将是一个很大的帮助。

关于将 C 代码编译为动态链接库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38781307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com