如何解决基于调用点的不同行为的函数?

How to solve a function acting differently based on callsite?

不确定标题的措辞如何,所以可以随意重命名,但我遇到的问题是我有一个功能在一个项目中有效,但在另一个项目中却失败了。下面是粗略的伪代码,显示 LibraryProject 中的一个调用有效,而 GameProject 中的调用无效。

ChildClass::do_stuff 中,win32_window HWND 是有效的,而第二个 failed_win32_window 是空的,glfw 抛出一个错误说它没有被初始化,尽管它已经有已初始化(因为第一次 glfw 调用成功,我手动逐步验证它是):

GLFWError #65537 Happen, The GLFW library is not initialized

这是显示两个项目和文件的伪代码。 GLFW 设置正确初始化,因为如果我在 LibraryProject 中执行所有 glfw 逻辑,window 显示正常。

//LibraryProject

////library_header.h
class ParentClass {
  GLFW* _mainWindow; //filled in elsewhere in the real code
  HWND getWin32Window() { return glfwGetWin32Window(_mainWindow); }
}

//GameProject

////game_header.h
#include "library_header.h" //from other Project

class ChildClass : public ParentClass {
  void do_stuff() {
    HWND win32_window = this->getWin32Window(); //this works because it goes down into LibraryProject.dll's module
    HWND failed_win32_window = glfwGetWin32Window(_mainWindow); //but literally the same call here doesn't because it happens within GameProject.exe
  }
}

////game_body.cpp

void function_called_elsewhere_in_game() {
    //called from GameProject.exe
    auto child = ChildClass();
    child.do_stuff();
}

我不确定这是 glfw 和我的设置问题,还是我误解了项目和依赖项的工作方式。

我尝试过的事情:

注意事项:


展示实际行为的图片。 magnolia_cocos_proj 是 GameProject,我是 运行 的 exe,libcocos2d 是我用作 DLL 的 LibraryProject(我不熟悉链接和 dll 的工作方式的细节) .

  1. win32_window has valid value
  2. definition of getWin32Window() to be 100% sure。注意模块现在在 libcocos2d.dll。
  3. after going over the second line, the error throws and the second window is null

正如我从“glfw3.lib is always being created”中了解到的那样,您使用的是静态链接。将库静态链接到不同的 dll 和 exe 会导致复制库的所有静态内存。在这种情况下,您应该为 GLFW 使用动态库。这是 glfw3dll.lib.

出现此错误的主要情况有两种:

GLFWError #65537 Happen, The GLFW library is not initialised

案例一 :

如果调用了 GLFW 函数,除非库已初始化,否则不得调用该函数,则会出现上述错误。 So, you need to initialise GLFW before calling any function that requires initialisation.

阅读一篇API introduction以供参考。使用 if-else 语句处理 glfwInit() 和错误。

阅读Moving from GLFW 2 to 3也很有用

案例二 :

如果您的计算机上安装了以前版本的 GLFW,则经常会发生此错误。 GLFW3 不喜欢 运行 以及安装的先前版本。 So, delete all the GLFW libraries and linkers and reinstall the latest GLFW 3 from scratch.

希望这对您有所帮助。