gcc动态调用dll文件的问题
本帖最后由 seeyou_shj 于 2019-10-1 21:06 编辑捉摸了一下午,没有头绪,请高手指点。
dll文件,名称为mydll.c,内容如下:
int dub(int x)
{
return x*2;
}
用mingw自带的编译器编译为dll文件。得到以便依的dll文件mydll.dll:
gcc -shared mydll.dll -c mydll.c
做个主程序,调用该dll文件。文件名main.c,内容如下:
#include <stdio.h>
#include <windows.h>
typedef int (*INT_FUNC)(int);
int main()
{
INT_FUNC db;
HINSTANCE hInstLibrary = LoadLibrary(L"mydll.dll");
db = (INT_FUNC)GetProcAddress(hInstLibrary,"dub");
printf("hello,%d\n",db(33));
FreeLibrary(hInstLibrary);
return 0;
}
静态调用dll文件倒是可以,用gcc main.c mydll.dll就可以编译成功。问题是怎么实现动态调用该dll文件?
用gcc main.c编译后,运行,则提示dll文件的编译mydll.dll没有被指定在windows上运行……网上查了一下,说是因为该dll没有注册的原因。于是利用regsvr32注册该dll,提示可能与windows版本不兼容……
直接不知道该怎么做了。
请高手指点。 本帖最后由 天心阁下 于 2019-9-30 19:44 编辑
编译mydll命令应为
gcc -shared -o mydll.dllmydll.c
mydll.dll和main.exe要在一个目录,不需要注册
mingw对宽字符支持性较差 没有做过这些,以下话就当参考或者胡说八道。
我读你的程序,就是加载一个库,我觉得默认是系统库,或者是从系统路径中找库名,这是一种绝对位置寻找库;
可以改成相对位置寻找库,不然那么多程序,系统需要注册多少库。
本人在不了解的情况下一本正经的胡说,可以参考{:301_998:}至于如何使用相对位置寻找库,不会:lol 看看是不是32位和64位不兼容的问题 天心阁下 发表于 2019-9-30 19:32
编译mydll命令应为
gcc -shared -o mydll.dllmydll.c
是在同一个目录。
静态调用的话没问题,现在就是怎么实现动态调用? nj001 发表于 2019-9-30 22:43
看看是不是32位和64位不兼容的问题
这个也注意到了,我的系统是64位,似乎不是这个问题。 就按你的来,能实现
gcc -shared -o mydll.dllmydll.c
HINSTANCE hInstLibrary = LoadLibrary(L"mydll.dll");
改
HINSTANCE hInstLibrary = LoadLibrary("mydll.dll");
gcc -o main.exe main.c
main
天心阁下 发表于 2019-10-1 18:22
就按你的来,能实现
gcc -shared -o mydll.dllmydll.c
HINSTANCE hInstLibrary = LoadLibrary(L"mydll. ...
我继续测试了一下,还是出错。错误信息:
…\mydll.dll没有被指定在windows上运行,或者它包含错误,请尝试使用原始安装媒体重新安装程序,或联系您的系统管理员或软件供应商以获取支持。
请问你的gcc版本信息、windows版本信息如何?
我的运行环境为gcc版本是5.3.0,win7,64位。不知道是不是编译环境问题。 seeyou_shj 发表于 2019-10-1 19:04
我继续测试了一下,还是出错。错误信息:
…\mydll.dll没有被指定在windows上运行,或者它包含错误,请 ...
应该是编译环境问题。回头用个64位的gcc编译一下应该可以了。 时间太久都没人回复了。看来还是得自己努力,不能奢求外界帮助。得找本书认真看一看了。。。
页:
[1]