【问题标题】:How to compile c program as dll如何将c程序编译为dll
【发布时间】:2018-05-10 01:20:49
【问题描述】:

我完成了我的 Checkers 游戏引擎的工作,并将使其与 CheckerBoard (http://www.fierz.ch/cbdeveloper.php) 兼容,并且它声明了这一点。

CheckerBoard 期望您的引擎编译为 dll 并位于 checkerboard.exe 的工作目录 - 或在路径中。一个引擎 必须支持 2 个必需的功能。 ...,您必须再提供 2 个 多版本支持的功能。所有人的调用约定 函数是 __stdcall()。

所需功能

当前的 CheckerBoard API(第 2 版)需要以下 2 个 功能:

int WINAPI getmove(int board[8][8], int color, double maxtime, char str[1024], int *playnow, int info, int moreinfo, struct CBmove *move);
int WINAPI enginecommand(char command[256], char reply[1024]);

我的引擎包括上述两个功能,我已经完成了所有设置(代码),但我在将其编译为 dll 时遇到了麻烦,这是我尝试过的(使用 gcc)

gcc -c engine.c
gcc -shared -o engine.dll engine.o

它按预期创建 dll,但 dll 不导出任何函数(如预期)。

我用Dependency walker程序扫描engine.dll文件,发现dll导出函数

  • _getmove@28
  • _enginecommand@20

我扫描了 CheckerBoard 目录中的一个引擎,发现它们导出了以下函数:

  • getmove
  • 引擎命令

我无法弄清楚为什么我创建的 dll 导出方式不同,也许它得到了 与 WINAPI 有什么关系?。

有什么想法吗?

这就是它的样子

#define EXPORT __declspec(dllexport)

EXPORT int WINAPI getmove(int b[8][8], int color, double time, char str[1024], int *playnow, int info, int unused, struct CBmove *cbmove){
    // ....
    return 0;
}


EXPORT int WINAPI enginecommand (char str[256], char reply[1024]){
    // ...
    return 0;
}

我需要通过 dll 导出这两个函数。

【问题讨论】:

  • 编辑您的问题,提供一些minimal reproducible example,或至少在您的engine.c 中显示相关代码(和声明);显示声明和定义 getmove 等的行

标签: c winapi gcc dll


【解决方案1】:

您可能需要使用Windows function attributes 注释(声明)这些导出函数,例如__attribute__((dllexport));我建议有一个 声明

extern WINAPI getmove(int b[8][8], int color, double time, 
                      char str[1024], int *playnow, int info, 
                      int unused, struct CBmove *cbmove) 
       __attribute__((dllexport));

在该函数的定义之前。

您可能需要将源代码编译为 position independent code(在 Linux 上,-fPIC 几乎需要它,对于 Windows DLL,您需要检查您的文档)。

所以尝试用gcc -Wall -O -g -fPIC -shared engine.c -o engine.dll编译

另请参阅this 相关问题(以及那里的答案)。

PS。我从未使用过 Windows(自 1987 年以来仅使用 Unix,自 1993 年以来仅使用 Linux)。我推荐阅读莱文的Linkers and loaders

【讨论】:

  • 更好地改进您自己的问题。通过编辑它并添加所有细节,至少通过在engine.c 中给出您导出函数的确切声明 或通过显示一些与您的代码相关的minimal reproducible example
猜你喜欢
  • 2011-06-01
  • 1970-01-01
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多