error LNK2019 无法解析的外部符号 vs2005

本文介绍了解决在使用Psapi.h时遇到的LNK2019错误的方法。作者在编写进程管理器时遇到了无法解析的外部符号错误,并通过添加附加依赖项解决了问题。文中还解释了静态链接和动态链接的区别。

这两天在写一个进程管理器,用到了Psapi.h中的一些进程函数。我将Psapi.h包含到源代码中,但链接时出现了4个LNK2019错误,都是Psapi.h中的函数引起的无法解析的外部符号。

错误 2 error LNK2019: 无法解析的外部符号 _GetModuleFileNameExW@16,该符号在函数 "public: class ATL::CStringT<wchar_t,class StrTraitMFC_DLL<wchar_t,class ATL::ChTraitsCRT<wchar_t> > > __thiscall CSystemMangerDlg::GetProcessPath(unsigned long)" (?GetProcessPath@CSystemMangerDlg@@QAE?AV?$CStringT@_WV?$StrTraitMFC_DLL@_WV?$ChTraitsCRT@_W@ATL@@@@@ATL@@K@Z) 中被引用 SystemMangerDlg.obj 

因为编译通过了,所以应该不是缺少Psapi.h的原因。我就上msdn2005查了LNK2019,不过里面列举的情况也没有和我类似。到网上搜,找了很久也没有和我类似的情况。后来看到一文章说是缺少附加依赖项。只要添加上附加依赖项,问题就解决了。添加附加依赖项的方法有:

方法 1:在包含头文件Psapi.h的同时,加上一行代码#pragma comment(lib,”psapi.lib”)

方法 2:[解决方案资源管理器]“项目->属性->配置属性->连接器->输入->附加依赖项”

虽然问题解决了,不过好像我还是不大理解依赖项这个东东!网上说的也很少。大概就是这个意思

一般大的工程软件都放在一个解决方案里面,分了好多模块(都是以工程方式组织在一起,或dll,或lib)。这样也是为了保证工程的同步开发的方便。
工程之间的链接可以动态链接:使用 LoadLibrary装入库,也可以静态链接,在工程配置中添加附加依赖库,或者在代码中使用 #pragma comment(lib,"xxx.lib);在Project->dependencies 中设置,主要是为了保证系统编译时候的顺序,既先编译无依赖项的项目,在编译其父依赖的项目。跟静态链接的效果是一样的。

转自:http://blog.youkuaiyun.com/lingdxuyan/archive/2009/07/29/4389634.aspx

### VS中解决 error LNK2001 无法解析外部符号 WinMain 的问题 在使用 Visual Studio 进行开发时,如果遇到 `error LNK2001: 无法解析外部符号 _WinMain` 报错,通常是因为项目配置与实际代码不匹配导致的。以下是详细的解决方案: #### 1. 确认项目类型 `WinMain` 是 Windows 应用程序的入口点函数,而不是控制台应用程序的 `main` 函数。如果项目配置为 Windows 应用程序,但代码中没有定义 `WinMain` 函数,则会触发此错误。需要确保项目的配置与代码一致。 - 如果项目是 **Windows 应用程序**,则需要定义 `WinMain` 函数: ```cpp #include <windows.h> int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // 应用程序逻辑 return 0; } ``` - 如果项目是 **控制台应用程序**,则需要将入口点改为 `main` 函数,并修改项目设置以支持控制台应用。 #### 2. 修改项目配置 通过调整项目属性来匹配正确的入口点函数。 - 右键点击项目名称,选择 **属性**。 - 在左侧导航栏中选择 **链接器 -> 系统**。 - 将 **子系统** 设置为 `Windows (/SUBSYSTEM:WINDOWS)` 或 `Console (/SUBSYSTEM:CONSOLE)`,具体取决于项目类型[^1]。 - 如果需要手动指定入口点,可以在 **链接器 -> 高级** 中设置 **入口点** 为 `WinMainCRTStartup` 或 `mainCRTStartup`,根据项目类型选择合适的值。 #### 3. 检查预处理器定义 有时,预处理器定义可能会影响项目的入口点函数。 - 右键点击项目名称,选择 **属性**。 - 在左侧导航栏中选择 **C/C++ -> 预处理器**。 - 确保没有多余的宏定义干扰项目类型。例如,对于控制台应用程序,可以添加 `_CONSOLE` 宏定义[^1]。 #### 4. 检查库文件是否正确 如果项目依赖于某些外部库,但这些库的版本或配置不正确,也可能导致此错误。 - 确保所有使用的库文件与当前项目的架构(如 x86 或 x64)和配置(如 Debug 或 Release)一致[^2]。 - 在 **链接器 -> 输入** 中检查是否正确引用了所需的库文件。 #### 5. 清理并重新构建项目 在修改配置后,建议清理并重新构建项目以确保更改生效。 - 在菜单栏中选择 **生成 -> 清理解决方案**。 - 然后选择 **生成 -> 重新生成解决方案**。 --- ### 示例代码:定义 WinMain 函数 如果项目是 Windows 应用程序,以下是一个简单的 `WinMain` 函数实现示例: ```cpp #include <windows.h> #include <tchar.h> LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { const TCHAR className[] = _T("SampleWindowClass"); WNDCLASS wc = {}; wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.lpszClassName = className; if (!RegisterClass(&wc)) { MessageBox(NULL, _T("窗口类注册失败"), _T("错误"), MB_OK | MB_ICONERROR); return 0; } HWND hwnd = CreateWindow(className, _T("示例窗口"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, NULL, NULL, hInstance, NULL); if (!hwnd) { MessageBox(NULL, _T("窗口创建失败"), _T("错误"), MB_OK | MB_ICONERROR); return 0; } ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); MSG msg = {}; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; } ``` --- ### 注意事项 - 如果项目是控制台应用程序,但错误提示为 `WinMain`,则可能是项目配置错误,需将子系统改为 `Console`。 - 如果项目是 Windows 应用程序,但未定义 `WinMain` 函数,则需要补充该函数实现。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值