如何解决基于调用点的不同行为的函数?
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 和我的设置问题,还是我误解了项目和依赖项的工作方式。
我尝试过的事情:
- 正在下载最新的glfw3
- 重建整个解决方案
- 切换引用和链接依赖项输入
注意事项:
- 这是在主线程中发生的,没有其他东西同时使用 glfw。它也是 100% 可重现的。
glfw3.lib
总是在我的 GameProject 输出文件夹中创建,基于 LibraryProject
- 对两个
glfwGetWin32Window
调用中的每一个调用的反汇编在反汇编中都有不同的地址,这让我相信它们是同一个库的两个不同副本,但我不确定。
- 这不是 cocos2d 的问题,我使用的游戏引擎是启动一个空白项目并调用
glfwGetWin32Window(..)
returns 一个有效的指针,即使在 GameProject 中也是如此,所以我做错了什么,但我不知道是什么。
展示实际行为的图片。 magnolia_cocos_proj
是 GameProject,我是 运行 的 exe,libcocos2d
是我用作 DLL 的 LibraryProject(我不熟悉链接和 dll 的工作方式的细节) .
正如我从“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
.
希望这对您有所帮助。
不确定标题的措辞如何,所以可以随意重命名,但我遇到的问题是我有一个功能在一个项目中有效,但在另一个项目中却失败了。下面是粗略的伪代码,显示 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 和我的设置问题,还是我误解了项目和依赖项的工作方式。
我尝试过的事情:
- 正在下载最新的glfw3
- 重建整个解决方案
- 切换引用和链接依赖项输入
注意事项:
- 这是在主线程中发生的,没有其他东西同时使用 glfw。它也是 100% 可重现的。
glfw3.lib
总是在我的 GameProject 输出文件夹中创建,基于 LibraryProject- 对两个
glfwGetWin32Window
调用中的每一个调用的反汇编在反汇编中都有不同的地址,这让我相信它们是同一个库的两个不同副本,但我不确定。 - 这不是 cocos2d 的问题,我使用的游戏引擎是启动一个空白项目并调用
glfwGetWin32Window(..)
returns 一个有效的指针,即使在 GameProject 中也是如此,所以我做错了什么,但我不知道是什么。
展示实际行为的图片。 magnolia_cocos_proj
是 GameProject,我是 运行 的 exe,libcocos2d
是我用作 DLL 的 LibraryProject(我不熟悉链接和 dll 的工作方式的细节) .
正如我从“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
.
希望这对您有所帮助。