我正在尝试编写一个简短的程序,通过名称终止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"和"OpenJobObjectA" - 定义WINVER
我对C和Windows API经验不是很丰富,找不到有关此问题的任何信息,因此如果有人能指点一下方向,那就太好了。
API参考:OpenJobObject
Kernel32.lib
。最后,虽然应该没有任何区别,但使用0x0600
而不是0x600
。 - WhozCraig