不确定标题的措辞如何,以便随时重命名,但是我遇到的问题是,我有一个函数可以在一个项目中使用,而在另一个项目中失败。下面是粗糙的伪代码,用于显示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.lib
始终基于LibraryProject中的一个在我的GameProject输出文件夹中创建glfwGetWin32Window
调用中的每一个逐步执行反汇编,在反汇编中有不同的地址,这使我相信它们是同一库的两个不同副本,但是我不确定。glfwGetWin32Window(..)
的游戏引擎即使在GameProject中也返回有效的指针,所以我做错了,但是我不知道。显示实际行为的图像。 magnolia_cocos_proj
是GameProject,是我正在运行的exe,libcocos2d
是我正在用作DLL的LibraryProject(我不熟悉链接和dll的工作方式的细节)。
答案 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
。
希望这会有所帮助。