gpt4 book ai didi

c++ - 使用 WINAPI 的复杂库依赖项目中未解析的外部符号

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:22:17 26 4
gpt4 key购买 nike

经过几天的搜索,我决定在这里发布一个问题,并希望有人有最终的想法或建议。

我编写了一个由 WindowManager 和 WINAPIWindow 类组成的 WINAPI 包装机制。后者以更结构化的方式使用大多数教程中著名的“第一个 WINAPI 窗口”功能,主要是 HWND 和 HINSTANCE。
备注:宏“_WINDOWS_”(不带空格,但此工具使其变为粗体)是在我的一个标题中定义的宏,以确定编译环境是否支持WIN32和WINAPI。

#if defined(_ _WINDOWS_ _)

LRESULT CALLBACK gDefaultWndProcFwd(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

#pragma region WINAPIWindow

class WINAPIWindow : public WindowBase
{
friend class WindowManager;

public:
virtual ~WINAPIWindow();

RESULT show();

inline HWND handle() const;

LRESULT CALLBACK wndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

private:
WINAPIWindow(__in const HINSTANCE hInstance, __in const Rect& bounds, __in const String& title = "", __in const int flags = WDF_DEFAULT);
HRESULT createWindowClass(__in const HINSTANCE hInstance, __in const String& clsName);

tInt16 _wndState;
HWND _hWnd;
};

typedef WINAPIWindow Window;

#pragma endregion
#elif

该机制位于名为“ShirabePlatformFeatureLayer.lib”的静态库中。
这个静态库使用另一个名为“ShiCore.lib”的自定义静态库中的类和代码,它不使用任何平台相关代码。

我的实际应用程序项目(x64!)现在使用 WindowManager 将两者作为附加依赖项导入。

尽管两个库项目都可以正常编译且没有错误,但编译应用程序项目会导致以下错误消息。
Error   43  error LNK2019: unresolved external symbol "public: struct HWND__ * __cdecl ShirabePlatformFeatureLayer::WINAPIWindow::handle(void)const " (?handle@WINAPIWindow@ShirabePlatformFeatureLayer@@QEBAPEAUHWND__@@XZ) referenced in function wWinMain    C:\Users\Dev.Dev-PC\Documents\Workspaces\ShirabeEngine\ShirabeDevelopment\Win32TestProject\main.obj Win32TestProject
Error 45 error LNK2019: unresolved external symbol "__int64 __cdecl ShirabePlatformFeatureLayer::gDefaultWndProcFwd(struct HWND__ *,unsigned int,unsigned __int64,__int64)" (?gDefaultWndProcFwd@ShirabePlatformFeatureLayer@@YA_JPEAUHWND__@@I_K_J@Z) referenced in function "private: long __cdecl ShirabePlatformFeatureLayer::WINAPIWindow::createWindowClass(struct HINSTANCE__ * const,class ShirabeCORE::String const &)" (?createWindowClass@WINAPIWindow@ShirabePlatformFeatureLayer@@AEAAJQEAUHINSTANCE__@@AEBVString@ShirabeCORE@@@Z) C:\Users\Dev.Dev-PC\Documents\Workspaces\ShirabeEngine\ShirabeDevelopment\Win32TestProject\ShirabePlatformFeatureLayer.lib(Window.obj) Win32TestProject
Error 44 error LNK2001: unresolved external symbol "public: struct HWND__ * __cdecl ShirabePlatformFeatureLayer::WINAPIWindow::handle(void)const " (?handle@WINAPIWindow@ShirabePlatformFeatureLayer@@QEBAPEAUHWND__@@XZ) C:\Users\Dev.Dev-PC\Documents\Workspaces\ShirabeEngine\ShirabeDevelopment\Win32TestProject\ShirabePlatformFeatureLayer.lib(WindowManager.obj) Win32TestProject
Error 46 error LNK1120: 2 unresolved externals C:\Users\Dev.Dev-PC\Documents\Workspaces\ShirabeEngine\ShirabeDevelopment\Debug\Win32TestProject.exe Win32TestProject

我检查了方法是否正确声明和定义。我还包括并导入了库。
#if defined(_ _WINDOWS_ _)

#pragma comment(lib, "user32.lib")
#pragma comment(lib, "kernel32.lib")
#pragma comment(lib, "gdi32.lib")
#include <Windows.h>

#endif

此外,我将上面的 3 个库注册为附加依赖项,库目录是 $(VC_LibraryPath_x64) 和 $(WindowsSDK_LibraryPath_x64)。

在分析了这一点后,我的第一个想法是,所有使用 WINAPI 类和结构的方法或函数都没有链接到导入库“ShirabePlatformFeatureLayer.lib”中。将它们注册为以上 3 个库作为具有与上述相同库路径的附加依赖项,并且/VERBOSE:LIB 向我显示这些库已附加但不是以“x64\gdi32.lib”作为消息而是“GDI32.DLL”。其他两个也是如此。

在应用程序项目中执行/VERBOSE:LIB 会显示“~.lib”而不是“~.DLL”的实际相对路径。

什么会导致方法在使用 WINAPI 功能时不被链接/包含/重要?
具有这么多 .lib 的通用构 build 计是否存在问题?
其他人有想法吗?

这里是整个受影响的代码(恕我直言): http://pastebin.com/f7MaBBwM

如果需要任何进一步的信息,请告诉我。

编辑:我继续搜索并在新的 MSBuild 系统中提出了“项目到项目”的依赖关系。虽然这似乎是同一个问题,但显然“ShirabePlatformFeatureLayer.lib”对导入库 kernel32、gdi32 和 user32 的依赖会导致问题,当 Win32TestProject 使用 ShirabePlatformFeatureLayer.lib 代码有效地使用它时。

不幸的是,我还没能通过给出的各种建议解决这个问题。关于这个主题的 10 篇不同的文章。 :/

编辑:引用 Rodrigo 的评论,我能够摆脱 handle() 未解析的符号。然而,第二个 gDefaultWndProcFwd 似乎是一个逻辑/设计错误。

一旦我设法获得 10 名声望,我将附上 WindowManager、WINAPIWindow 和 gDefaultWndProcFwd 之间关系的图像!
这里说的是文字描述:

1) 创建窗口意味着使用 Window.h 中的前向声明创建引用 gDefaultWndProcFwd 的 WindowClassEx 结构。

2) 当窗口被创建并显示时,应该调用该方法,该方法引用 WIndowManager::get(key : HWND) : WindowBase*;

3) 如果找到,该函数在窗口指针上调用 wndProc 并将处理留给 wndproc 的指定实现。

gDefaultWndProcFwd 在 WindowManager.h/.cpp 中声明和定义。

设计缺陷越来越明显,我正在考虑解决方案!
有关实际代码,请参阅 pastebin 链接!

非常感谢您提前提供的帮助。

真诚的,马克

最佳答案

您有 2 个未解析的外部符号:

HWND ShirabePlatformFeatureLayer::WINAPIWindow::handle(void) const
LRESULT ShirabePlatformFeatureLayer::gDefaultWndProcFwd(HWND,UINT,WPARAM,LPARAM)

第一个可能是由于 handle()内联。您可能在 CPP 文件中定义了它(或者您忘记了它?),但由于它是内联的,因此不会导出定义。相反,它应该可供每个需要它的编译单元使用。换句话说,内联函数应该定义在与声明相同的头文件中。

第二个比较棘手,没有看到你的所有代码。但我敢打赌,你只是忘了写 gDefaultWndProcFwd() 的定义。 .或者,也许您将它写在不同的命名空间中,或者使用不同的参数。

请注意,静态库没有链接,因此在构建库时不会发生像您这样的 Unresolved 符号错误,即使缺陷在库本身中也是如此。链接最终可执行文件时总是会发生链接器错误。

更新 :好的,我说这很棘手......重新阅读您的代码我注意到有问题的函数被声明了两次,并定义了一次。那本身不是问题,但是一起看两个声明:
LRESULT CALLBACK gDefaultWndProcFwd(HWND hWnd, UINT msg, LPARAM lParam, WPARAM wParam);
LRESULT CALLBACK gDefaultWndProcFwd(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

定义是:
LRESULT CALLBACK gDefaultWndProcFwd(HWND hWnd, UINT msg, LPARAM lParam, WPARAM wParam)

你看得到差别吗? WPARAMLPARAM被交换了!!!

关于c++ - 使用 WINAPI 的复杂库依赖项目中未解析的外部符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24296144/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com