如何解决基于呼叫站点的功能不同的功能?

时间:2019-05-24 04:58:00

标签: c++ visual-studio-2013 linker glfw

不确定标题的措辞如何,以便随时重命名,但是我遇到的问题是,我有一个函数可以在一个项目中使用,而在另一个项目中失败。下面是粗糙的伪代码,用于显示LibraryProject中的一个调用有效,而GameProject中的该调用无效。

ChildClass::do_stuff中,win32_window HWND有效,而第二个failed_win32_window为null,glfw抛出错误,表明它尚未初始化,尽管它已经被初始化了(因为第一个glfw调用成功,我已经手动执行以验证它是否正确):

GLFWError #65537 Happen, The GLFW library is not initialized

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

//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和我的设置的问题,还是我误解了项目和依赖项的工作原理。

我尝试过的事情:

  • 下载最新的glfw3
  • 重建整个解决方案
  • 切换引用和链接依赖项输入

注意事项:

  • 这发生在主线程中,没有其他东西同时使用glfw了。它也是100%可重现的。
  • glfw3.lib始终基于LibraryProject中的一个在我的GameProject输出文件夹中创建
  • 为两个glfwGetWin32Window调用中的每一个逐步执行反汇编,在反汇编中有不同的地址,这使我相信它们是同一库的两个不同副本,但是我不确定。
  • 这不是cocos2d的问题,我用于启动空白项目并调用glfwGetWin32Window(..)的游戏引擎即使在GameProject中也返回有效的指针,所以我做错了,但是我不知道。

显示实际行为的图像。 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

2 个答案:

答案 0 :(得分:2)

从“ glfw3.lib一直在被创建”中了解到,您使用静态链接。将库静态链接到其他dll和exe会导致复制该库的所有静态内存。在这种情况下,应为GLFW使用动态库。是glfw3dll.lib

答案 1 :(得分:2)

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

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

希望这会有所帮助。