Windows api编程用c: undefined引用OpenJobObject



我正在尝试编写一个短程序,允许我通过其名称终止Windows作业对象。下面是文件TerminateJobObject.c:

的(缩短)代码
#ifndef _WIN32_WINNT
    #define _WIN32_WINNT 0x600
#endif
#define JOB_OBJECT_TERMINATE 0x0008
#include <windows.h>
#include <tchar.h> 
#include <stdio.h>
#include <limits.h>

LPTSTR jobObjectName; 
HANDLE jobObj; 
int main(int argc, TCHAR *argv[]){
    jobObjectName = argv[0];    
    jobObj = OpenJobObject(JOB_OBJECT_TERMINATE,FALSE,jobObjectName);
    TerminateJobObject(jobObj,0);
}

使用"gcc TerminateJobObject.c -o TerminateJobObject"编译时,我得到以下错误:

TerminateJobObject.c: In function 'main'
C:/<...>:TerminateJobObject.c:(.text+0x62):undefined reference to 'OpenJobObject'
collect2: ld returned 1 exit status

我不明白为什么链接器不能解析OpenJobObject。TerminateJobObject链接正确,也来自windows api。

我试过了:

    编译器:gcc, clang
  • _WIN32_WINNT (0x500,0x600,0x601)的不同版本
  • 不同的操作系统:Windows 7和Windows server 2008
  • "OpenJobObjectW"one_answers"OpenJobObjectA"
  • 定义WINVER

我对c和windows api不是很有经验,在这个问题上找不到任何东西,所以如果有人能给我指出一个方向,那就太好了。

Api reference: OpenJobObject

我解决了。问题是mingw32的头文件winbase.h(通过windows.h包含)缺少OpenJobObject的函数定义,如Harry Johnston所怀疑的。

我添加了以下行到…/mingw/include/winbase.h

#define OpenJobObject __MINGW_NAME_AW(OpenJobObject)
WINBASEAPI HANDLE WINAPI OpenJobObjectA (DWORD dwDesiredAccess, WINBOOL bInheritHandle, LPCSTR lpName);
WINBASEAPI HANDLE WINAPI OpenJobObjectW (DWORD dwDesiredAccess, WINBOOL bInheritHandle, LPCWSTR lpName);

在winbase.h from mingw-w64

接下来,我将调用改为"OpenJobObjectA",现在它工作了。:)谢谢你的帮助!

编辑:正如Hans Passant指出的那样,更干净的方法可能是迁移到mingw-64或其他版本。

相关内容

最新更新