Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BehaviorLoaderImplement 依赖于静态变量的初始化顺序 #13

Closed
chenditc opened this issue Aug 13, 2017 · 7 comments
Closed

BehaviorLoaderImplement 依赖于静态变量的初始化顺序 #13

chenditc opened this issue Aug 13, 2017 · 7 comments

Comments

@chenditc
Copy link

在集成 c++ 生成的代码时,我们先将其编译成 .a 静态库,然后在 link 阶段将其集成进服务器中。但是执行时会报错:

The types/internal/behaviac_agent_meta.cpp should be exported from the behaviac designer, and then integrated into your project!

这个检查是在 src/common/meta.cpp:806 进行的
if (signature != (long long)AgentMeta::GetTotalSignature())

GetTotalSignature() 依赖于 BehaviorLoaderImplement 的初始化,但是 BehaviorLoaderImplement 是作为静态变量初始化的。这样一来,它的初始化就依赖于 linkder 的 Link 顺序和编译选项。这在使用的时候就会造成许多麻烦。

这个问题是否可以打个补丁修复呢。

@cainhuang
Copy link
Collaborator

这个静态变量初始化时机没有问题,因为BehaviorLoaderImplement肯定在AgentMeta::checkSignature()方法被调用前就初始化好了。
如果报这个错,说明你们导出的行为树文件比那个behaviac_agent_meta.cpp文件要新一些,也即可能导出的行为树文件中用到了新加的Agent子类或其成员属性和方法,需要重新导出behaviac_agent_meta.cpp文件,这样最新的元信息胶水代码才能跟导出的最新的行为树文件匹配上。

@chenditc
Copy link
Author

我用 gdb 断点调试了一下,第一次调用 checkSignature 的时候,signature 尚未被赋值,仍然是 0,并且 BehaviorLoaderImplement 构造器的构造器并没有被调用。

可以这样重现:

  1. 导出行为树 cpp 文件以及 xml
  2. 将导出的文件编译为 .a 静态库
  3. 编译测试代码
  4. 将 .a 行为树静态库 link 进测试代码成可执行文件

@cainhuang
Copy link
Collaborator

这种情况,需要在你游戏初始化的地方调用InitBehaviorLoader(),
在你游戏退出的地方调用DestroyBehaviorLoader()

这两个接口声明在meta.h中,实现在导出的behaviac_agent_meta.cpp,不用自己添加任何代码,直接调用这2个接口行了

@chenditc
Copy link
Author

Ok, 这个做法是可以的。希望这个可以加入文档以及教程中,让新手更容易上手。

@cainhuang
Copy link
Collaborator

好,我先放在bbs问题里面去了

@v012345
Copy link

v012345 commented Sep 20, 2023

确实 我是作为 .lib 来使用 behaviac_generated , static BehaviorLoaderImplement _behaviorLoaderImplement_; 就完全不是初始化;
之后把 behaviac_generated 里的 cpp 文件直接放到 exe 里就没有这个问题了

@wumohai
Copy link

wumohai commented Sep 20, 2023 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants