Godot 4.1 如何在 GDExtension 中加载具有多个 C++ 源的共享库

问题描述 投票:0回答:1

我正在研究求和器示例: https://github.com/paddy-exe/GDExtensionSummator

我添加了一个新的 C++ 源代码,称为 Cppkinematics。我将它和原始源求和器放在共享库的新名称下:godotcppsharedlib。我可以在 GDScript 中调用 Cppkinematics,但原始源 Summator 无法从共享库中运行。 GDScript 在场景脚本中显示错误:“标识符求和器未在当前范围内声明”。

这里是有问题的 Github 链接: https://github.com/creel904/godot-bind-cpp

以下是我认为可能包含罪魁祸首问题的文件:

game/bin/godotcppsharedlib.gdextension:

[configuration]
entry_symbol = "godotcppsharedlib_library_init"
compatibility_minimum = 4.1
[libraries]
windows.x86_64.debug = "res://bin/libgdgodotcppsharedlib.windows.template_debug.x86_64.dll"
windows.x86_64.release = "res://bin/libgdgodotcppsharedlib.windows.template_release.x86_64.dll"

game.godot xtension_list.cfg

res://bin/godotcppsharedlib.gdextension

扩展/src/register_types.cpp

#include "register_types.h"
#include "summator.h"
#include "cppkinematics.h"
#include <gdextension_interface.h>
#include <godot_cpp/core/class_db.hpp>
#include <godot_cpp/core/defs.hpp>
#include <godot_cpp/godot.hpp>
using namespace godot;
void initialize_summator_types(ModuleInitializationLevel p_level)
{
    if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
        return;
    }
    ClassDB::register_class<Summator>();
}
void uninitialize_summator_types(ModuleInitializationLevel p_level) {
    if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
        return;
    }
}
void initialize_cppkinematics_types(ModuleInitializationLevel p_level)
{
    if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
        return;
    }
    ClassDB::register_class<Cppkinematics>();
}
void uninitialize_cppkinematics_types(ModuleInitializationLevel p_level) {
    if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
        return;
    }
}
extern "C"
{
    GDExtensionBool GDE_EXPORT godotcppsharedlib_library_init(GDExtensionInterfaceGetProcAddress p_get_proc_address, GDExtensionClassLibraryPtr p_library, GDExtensionInitialization *r_initialization) {
        GDExtensionBinding::InitObject init_obj(p_get_proc_address, p_library, r_initialization);
        init_obj.register_initializer(initialize_summator_types);
        init_obj.register_terminator(uninitialize_summator_types);
        init_obj.register_initializer(initialize_cppkinematics_types);
        init_obj.register_terminator(uninitialize_cppkinematics_types);
init_obj.set_minimum_library_initialization_level(MODULE_INITIALIZATION_LEVEL_SCENE);
        return init_obj.init();
    }
}

扩展\src\summator.cpp扩展\src\summator.h 与求和器示例相比没有变化

扩展/src/register_types.h:

#ifndef SUMMATOR_REGISTER_TYPES_H
#define SUMMATOR_REGISTER_TYPES_H
void initialize_summator_types();
void uninitialize_summator_types();
#endif // SUMMATOR_REGISTER_TYPES_H
#ifndef CPPKINEMATICS_REGISTER_TYPES_H
#define CPPKINEMATICS_REGISTER_TYPES_H
void initialize_cppkinematics_types();
void uninitialize_cppkinematics_types();
#endif // CPPKINEMATICS_REGISTER_TYPES_H

S构造:

#!/usr/bin/env python
import os
import sys
env = SConscript("godot-cpp/SConstruct")
env.Append(CPPPATH=["extension/src/"])
sources = Glob("extension/src/*.cpp")
if env["platform"] == "macos":
    library = env.SharedLibrary(
        "game/bin/libgdgodotcppsharedlib.{}.{}.framework/godotcppsharedlib.{}.{}".format(
            env["platform"], env["target"], env["platform"], env["target"]
        ),
        source=sources,
    )
else:
    library = env.SharedLibrary(
        "game/bin/libgdgodotcppsharedlib{}{}".format(env["suffix"], env["SHLIBSUFFIX"]),
        source=sources,
    )
Default(library)
c++ scons godot4
1个回答
0
投票

您的GDExtension只能为扩展注册一个初始化器和终止器。注册第二个将覆盖您之前注册的。但是,如果您想像这样组织类型,您可以在这些函数中调用多个不同的函数。

#include "register_types.h"
#include "summator.h"
#include "cppkinematics.h"
#include <gdextension_interface.h>
#include <godot_cpp/core/class_db.hpp>
#include <godot_cpp/core/defs.hpp>
#include <godot_cpp/godot.hpp>
using namespace godot;
void initialize_types(ModuleInitializationLevel p_level)
{
    initialize_summator_types(p_level);
    initialize_cppkinematics_types(p_level);
}
void uninitialize_types(ModuleInitializationLevel p_level)
{
    uninitialize_summator_types(p_level);
    uninitialize_cppkinematics_types(p_level);
}
void initialize_summator_types(ModuleInitializationLevel p_level)
{
    if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
        return;
    }
    ClassDB::register_class<Summator>();
}
void uninitialize_summator_types(ModuleInitializationLevel p_level) {
    if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
        return;
    }
}
void initialize_cppkinematics_types(ModuleInitializationLevel p_level)
{
    if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
        return;
    }
    ClassDB::register_class<Cppkinematics>();
}
void uninitialize_cppkinematics_types(ModuleInitializationLevel p_level) {
    if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
        return;
    }
}
extern "C"
{
    GDExtensionBool GDE_EXPORT godotcppsharedlib_library_init(GDExtensionInterfaceGetProcAddress p_get_proc_address, GDExtensionClassLibraryPtr p_library, GDExtensionInitialization *r_initialization) {
        GDExtensionBinding::InitObject init_obj(p_get_proc_address, p_library, r_initialization);
        init_obj.register_initializer(initialize_types);
        init_obj.register_terminator(uninitialize_types);
init_obj.set_minimum_library_initialization_level(MODULE_INITIALIZATION_LEVEL_SCENE);
        return init_obj.init();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.