我完成了我的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导出函数
我扫描了CheckerBoard目录中的一个引擎,我发现它们导出了以下功能:
我无法弄清楚为什么我创造出口的方式不同,也许它得到了 与 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导出这两个函数。
答案 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书