编辑:我似乎已经解决了这个问题,即使我不知道它为什么起作用的细节。请参阅此帖子下方的答案。
我正在尝试编译示例语言监视器 PJLMon,但链接器错误导致代码无法成功构建。我会发布整个代码,但它有点多(其中大部分可能与手头的问题无关),并且很容易在网上找到。
有问题的错误是:“1>pjlmon.obj:错误 LNK2019:未解析的外部符号 _SetPort 在函数 _ClearPrinterStatusAndIniJobs 中引用”
有问题的代码指的是 pjlmon.c 中的代码,如下所示:
VOID
ClearPrinterStatusAndIniJobs(
__in PINIPORT pIniPort
)
{
PORT_INFO_3 PortInfo3;
if ( pIniPort->PrinterStatus ||
(pIniPort->status & PP_PRINTER_OFFLINE) ) {
pIniPort->PrinterStatus = 0;
pIniPort->status &= ~PP_PRINTER_OFFLINE;
ZeroMemory(&PortInfo3, sizeof(PortInfo3));
SetPort(NULL, pIniPort->pszPortName, 3, (LPBYTE)&PortInfo3); // LNK2019 HERE
}
SendJobLastPageEjected(pIniPort, ALL_JOBS, FALSE);
}
我没有以任何方式修改程序逻辑。我已经修改了一些要在本地找到的头文件(即 #include "winsplp.h" 而不是 ),但是这些文件在其他方面没有改变,所以我认为这不是问题。不过,我将继续展示我的定义和包含,以防万一我犯了一个愚蠢的错误:
#define USECOMM
#include "precomp.h"
#include "ntddpar.h"
#include <windows.h>
#undef SetPort
#include <WinReg.h>
#include <winioctl.h>
我关闭了 CLR,并且没有使用预编译的头文件。
在 Project->Properties->Linker->Input->Additional Dependencies 下,我添加了“winspool.lib; advAPI32.lib”。这些文件应包含对 winspool.h(自动包含在 windows.h 中)和 winreg.h 中函数的引用。
#undef SetPort 代码删除设置为将“SetPort”更改为“SetPortW”(unicode)或“SetPortA”(ascii)的宏。我不认为这是一个问题。
我有点迷失从这里去哪里。任何建议将不胜感激!