首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MinGW似乎没有链接到user32

MinGW似乎没有链接到user32
EN

Stack Overflow用户
提问于 2009-08-12 16:06:15
回答 1查看 3.3K关注 0票数 1

好的。我一直在试图让我用Java编写的程序能够通过使用JNI来找出Windows桌面是否被锁定。我已经成功地让JNI工作了,但是我最初使用的C代码没有返回正确的答案。我得到了一些新代码(from here on SO),对它做了一些修改,但我有链接错误。

链接时,我得到两个未定义的引用,一个指向OpenInputDesktop,一个指向CloseDesktop。它们都是user32.dll的一部分。

用于链接和创建DLL的命令是:

代码语言:javascript
复制
c:/MinGW/bin/gcc -shared -o JNIHelper.dll
                  com_little_cute_display_helper_JNIHelper.o
                  -Wl,--add-stdcall-alias,--kill-at,--output-def,def_file

我尝试显式地添加lib目录和库,但是错误是相同的。这并不奇怪,因为MinGW将我的命令扩展到:

代码语言:javascript
复制
 c:/MinGW/bin/../libexec/gcc/mingw32/3.4.5/collect2.exe --shared -Bdynamic
           -e _DllMainCRTStartup@12 --enable-auto-image-base -o JNIHelper.dll
           /mingw/lib/dllcrt2.o c:/MinGW/bin/../lib/gcc/mingw32/3.4.5/crtbegin.o
           -Lc:/MinGW/bin/../lib/gcc/mingw32/3.4.5
           -Lc:/MinGW/bin/../lib/gcc -L/mingw/lib/gcc/mingw32/3.4.5
           -Lc:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../mingw32/lib
           -L/mingw/lib/gcc/mingw32/3.4.5/../../../../mingw32/lib
           -L/mingw/lib -Lc:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../..
           -L/mingw/lib/gcc/mingw32/3.4.5/../../.. 
           com_little_cute_display_helper_JNIHelper.o
           --add-stdcall-alias --kill-at --output-def def_file
           -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt -luser32 -lkernel32
           -ladvapi32 -lshell32 -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt
           c:/MinGW/bin/../lib/gcc/mingw32/3.4.5/crtend.o

因此,如果您阅读所有这些混乱的内容,您将看到c:/MinGW/lib (其中保存libuser32.a )和-luser32都在其中。基本上,这应该联系得很好。

这是我之前只在没有-lwtsapi32的情况下使用的命令(因为我使用的是终端服务API),它当时运行得很好,并且能够找到它需要的库。

现在,我在代码中所做的更改(dan的答案)是删除静态变量,因为我在XP上,不需要担心Win9x的兼容性。当我按原样使用他的代码时,我得到了相同的基本错误,例如,无法链接到GetProcAddress,尽管这是在kernel32中,链接器命令中已经有了。

我想我错过了一些魔法指令。标准Win32API中的函数似乎不想链接到。我已经多年没有使用C和MinGW了。我做了很多以前也没做过的事。

有人能给我指明正确的方向吗?

好吧,我一直在做这件事,但我还是被困住了。如果我把源代码变成一个简单的小C程序(没有JNI的东西),它看起来是这样的:

代码语言:javascript
复制
#define _WIN32_WINNT 0x0501
#define WINVER 0x0501
#include <windows.h>
#include <windef.h>
#include <winnt.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow) {

    HDESK hDesk = OpenInputDesktop(0, FALSE, MAXIMUM_ALLOWED);

    if (hDesk) {
        CloseDesktop(hDesk);

        printf("unlocked");
    } else {
        printf("locked");
    }
}

MinGW将很高兴地编译和链接该文件,并运行可执行文件。如果我使用了我一直使用的命令(更改以反映该文件),它将生成一个DLL,没有问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-08-12 20:10:37

我已经解决了问题。当我编译我的代码以放入一个供Java使用的DLL供JNI使用时,当我使用nm查看对象文件中的内容时,该对象文件包含以下两个清单:

代码语言:javascript
复制
     U _CloseDesktop
     U _OpenInputDesktop

当涉及到链接的时候,这些是找不到的,所以我得到链接器错误。当我将没有所有JNI内容的代码编译到DLL (这显然不适用于Java)时,符号如下所示:

代码语言:javascript
复制
     U _CloseDesktop@4
     U _OpenInputDesktop@12

如您所见,在编译以生成JNI DLL时,我的函数没有使用@n进行修饰,这就是导致链接错误的原因。有人知道我怎么解决这个问题吗?

那么问题出在哪里?

I不包括windows.h

一切都不同了。也许这能帮到别人。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1267148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档