如何将c程序编译为dll

时间:2017-11-26 19:33:09

标签: c winapi gcc dll

我完成了我的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
  • enginecommand

我无法弄清楚为什么我创造出口的方式不同,也许它得到了 与 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导出这两个函数。

1 个答案:

答案 0 :(得分: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)。我建议阅读Levine的Linkers and loaders