seeyou_shj 发表于 2019-9-30 18:11

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:32

本帖最后由 天心阁下 于 2019-9-30 19:44 编辑

编译mydll命令应为
gcc -shared -o mydll.dllmydll.c

mydll.dll和main.exe要在一个目录,不需要注册
mingw对宽字符支持性较差

SummerSui 发表于 2019-9-30 21:15

没有做过这些,以下话就当参考或者胡说八道。
我读你的程序,就是加载一个库,我觉得默认是系统库,或者是从系统路径中找库名,这是一种绝对位置寻找库;
可以改成相对位置寻找库,不然那么多程序,系统需要注册多少库。
本人在不了解的情况下一本正经的胡说,可以参考{:301_998:}至于如何使用相对位置寻找库,不会:lol

nj001 发表于 2019-9-30 22:43

看看是不是32位和64位不兼容的问题

seeyou_shj 发表于 2019-10-1 09:04

天心阁下 发表于 2019-9-30 19:32
编译mydll命令应为
gcc -shared -o mydll.dllmydll.c



是在同一个目录。

静态调用的话没问题,现在就是怎么实现动态调用?

seeyou_shj 发表于 2019-10-1 09:05

nj001 发表于 2019-9-30 22:43
看看是不是32位和64位不兼容的问题

这个也注意到了,我的系统是64位,似乎不是这个问题。

天心阁下 发表于 2019-10-1 18:22

就按你的来,能实现
gcc -shared -o mydll.dllmydll.c
HINSTANCE hInstLibrary = LoadLibrary(L"mydll.dll");

HINSTANCE hInstLibrary = LoadLibrary("mydll.dll");
gcc -o main.exe main.c
main

seeyou_shj 发表于 2019-10-1 19:04

天心阁下 发表于 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 21:06

seeyou_shj 发表于 2019-10-1 19:04
我继续测试了一下,还是出错。错误信息:
…\mydll.dll没有被指定在windows上运行,或者它包含错误,请 ...

应该是编译环境问题。回头用个64位的gcc编译一下应该可以了。

seeyou_shj 发表于 2019-11-15 10:26

时间太久都没人回复了。看来还是得自己努力,不能奢求外界帮助。得找本书认真看一看了。。。
页: [1]
查看完整版本: gcc动态调用dll文件的问题