libLoader本体加载失败,以及插件加载失败
Code of Conduct
- [X] I conform
问题描述
输出日志和配置文件(账号配置没截图,确认正确)
目录确定没错,但总是无法加载
日志
No response
版本
2.12.0-RC
组件
Loader, LibLoader
本地的java环境和是否有配置java_home环境变量?
Eritque arcus
------------------ Original ------------------ From: DragonheartLX @.> Date: Sun, Jul 17, 2022 11:19 AM To: Nambers/MiraiCP @.> Cc: Subscribed @.***> Subject: Re: [Nambers/MiraiCP] libLoader调用dll失败 (Issue #119)
Code of Conduct
I conform
问题描述
输出日志和配置文件(账号配置没截图,确认正确)
目录确定没错,但总是无法加载
日志
No response
版本
2.12.0-RC
组件
Loader, LibLoader
— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you are subscribed to this thread.Message ID: @.***>
之前使用2.11.0的时候配置了
鉴于我现在在外面,可能要等到24号后才能修这个问题,建议你先回滚到上一个版本
或者你可以试一下自己编译下 libloader,就clone miraicp,然后cmake target=libloader 然后提供下java环境的信息,比如版本和操作系统,然后确保下的 libloader 是 release 里的
可能是libloader的移植性没做好
建议先自己编译一份libloader解决燃眉之急。顺便想了解一下你的jdk路径在哪个位置,可能和我们做测试的时候和你的路径不太一样
https://github.com/Nambers/MiraiCP-devReleases/tree/main/dev 先试试这个?虽然感觉解决不了,大概率还是得自行编译一份。
https://github.com/Nambers/MiraiCP-devReleases/tree/main/dev 先试试这个?虽然感觉解决不了,大概率还是得自行编译一份。
试了一下不行

自己编译了libLoader,没有了之前的报错,但是还是加载不了,MiraiCPPlugin.dll是template里编译的。
我的jdk路径:C:\Program Files\Android\Jdk\microsoft_dist_openjdk_1.8.0.25
检查是否用新的Miraicp.h和miraicp.cpp覆盖旧的, 以及建议升下jdk版本(只是建议)
Eritque arcus
------------------ Original ------------------ From: DragonheartLX @.> Date: Sun, Jul 17, 2022 3:32 PM To: Nambers/MiraiCP @.> Cc: Eritque arcus @.>, Comment @.> Subject: Re: [Nambers/MiraiCP] libLoader调用dll失败 (Issue #119)
自己编译了libLoader,没有了之前的报错,但是还是加载不了,MiraiCPPlugin.dll是template里编译的。
我的jdk路径:C:\Program Files\Android\Jdk\microsoft_dist_openjdk_1.8.0.25
— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.***>
是用v2.12.0-RC的template编译的 jdk换成了java 17 路径:D:\DragonheartLX\java\java17.0.1 编译通过,运行还是这个报错
https://github.com/Nambers/MiraiCP/blob/c960f5a86383c049bb7d80daaef2fff10fa8a1d7/cpp/src/libloader/PluginListImplements.cpp#L58
这个应该是插件的问题,为了安全性我们不会加载不符合格式的插件,如果四个符号测试没有通过libLoader会拒绝加载。你可以查找一些extern "C"的四个符号是否在MiraiCP.cpp里
extern "C" { void FUNC_ENTRANCE(const LibLoader::LoaderApi::interface_funcs &); void FUNC_EVENT(std::string content); void FUNC_EXIT(); const MiraiCP::PluginConfig &PLUGIN_INFO(); }
MiraiCP.hpp里,这四个符号对应的定义存在吗?
自己编译了libLoader,没有了之前的报错,但是还是加载不了,MiraiCPPlugin.dll是template里编译的。
我的jdk路径:C:\Program Files\Android\Jdk\microsoft_dist_openjdk_1.8.0.25
我注意到一个问题,一楼你发的插件路径和这个图里显示的路径不一致,是你后来修改了吗?如果不是的话可以先检查一下json,以及相对路径最好用".\"开头,之前测试的时候发现Linux上相对路径不是"./"开头会找不到文件,不知道Windows会不会也有这个毛病
自己编译了libLoader,没有了之前的报错,但是还是加载不了,MiraiCPPlugin.dll是template里编译的。 我的jdk路径:C:\Program Files\Android\Jdk\microsoft_dist_openjdk_1.8.0.25
我注意到一个问题,一楼你发的插件路径和这个图里显示的路径不一致,是你后来修改了吗?如果不是的话可以先检查一下json,以及相对路径最好用"."开头,之前测试的时候发现Linux上相对路径不是"./"开头会找不到文件,不知道Windows会不会也有这个毛病
因为怕是文件路径的问题更改过,windows上相对路径不用“.\”开头确实会找不到文件
extern "C" { void FUNC_ENTRANCE(const LibLoader::LoaderApi::interface_funcs &); void FUNC_EVENT(std::string content); void FUNC_EXIT(); const MiraiCP::PluginConfig &PLUGIN_INFO(); }
MiraiCP.hpp里,这四个符号对应的定义存在吗?
有
如果是这样的话就比较麻烦了,你可以把相关部分的源代码发一下吗,之后测试下编译?
或者你有兴趣的话可以先试试给libloader debug,下载这个仓库,执行
python script/init.py "2.12.0-RC"
生成一个cmake项目,或者直接自己配cmake。符号找不到确实有点费解,这四个符号是MiraiCP.cpp里自己定义的理论上应该不会找不着:(
如果是这样的话就比较麻烦了,你可以把相关部分的源代码发一下吗,之后测试下编译?
或者你有兴趣的话可以先试试给libloader debug,下载这个仓库,执行
python script/init.py "2.12.0-RC"生成一个cmake项目,或者直接自己配cmake。符号找不到确实有点费解,这四个符号是MiraiCP.cpp里自己定义的理论上应该不会找不着:(
推送到仓库了 https://github.com/Dragonheart-longxin/Sibilla 因为对cmake不是很熟悉所以直接用vs创建项目
我看到这个目录结构大概猜到是什么问题了……应该是MiraiCP.cpp没有加入编译。你先尝试下面两个解决方案之一:
- 手动把MiraiCP.cpp文件加入vs项目的源文件
- 把MiraiCP.cpp移动到你的 Sibilla/Sibilla 文件夹下面然后重新生成一次项目
以及windows上的cmake是可以生成vs项目的,参考template的README
我看到这个目录结构大概猜到是什么问题了……应该是MiraiCP.cpp没有加入编译。你先尝试下面两个解决方案之一:
- 手动把MiraiCP.cpp文件加入vs项目的源文件
- 把MiraiCP.cpp移动到你的 Sibilla/Sibilla 文件夹下面然后重新生成一次项目
MiraiCP.cpp在导入的时候包含在项目里了 我试了一下不把MiraiCP.cpp包含编译不通过
1>------ 已启动生成: 项目: Sibilla, 配置: Debug x64 ------
1>Sibilla.obj : error LNK2001: 无法解析的外部符号 "public: static class std::unique_ptr<class MiraiCP::CPPPlugin,struct std::default_delete<class MiraiCP::CPPPlugin> > MiraiCP::CPPPlugin::plugin" (?plugin@CPPPlugin@MiraiCP@@2V?$unique_ptr@VCPPPlugin@MiraiCP@@U?$default_delete@VCPPPlugin@MiraiCP@@@std@@@std@@A)
1>D:\DragonheartLX\projects\Sibilla\build\Sibilla\Debug\Sibilla.dll : fatal error LNK1120: 1 个无法解析的外部命令
1>已完成生成项目“Sibilla.vcxproj”的操作 - 失败。
========== “生成”: 0 成功,1 失败,0 更新,0 已跳过 ==========
我知道cmake可以生成vs项目,只是在后续的开发中会不可避免的修改CMakeLists.txt,而我对cmake的命令不是很熟悉所以选择直接vs生成项目
在编译输出里有这些警告,可能原因在这?
1>D:\DragonheartLX\projects\Sibilla\Sibilla\MiraiCP\MiraiCP.cpp(1435,1): warning C4297: “FUNC_ENTRANCE”: 假定函数不引发异常,但确实发生了
1>D:\DragonheartLX\projects\Sibilla\Sibilla\MiraiCP\MiraiCP.cpp(1435,1): message : 函数是 extern "C" 并且指定了 /EHc
1>D:\DragonheartLX\projects\Sibilla\Sibilla\MiraiCP\MiraiCP.cpp(1439,1): warning C4297: “FUNC_ENTRANCE”: 假定函数不引发异常,但确实发生了
1>D:\DragonheartLX\projects\Sibilla\Sibilla\MiraiCP\MiraiCP.cpp(1439,1): message : 函数是 extern "C" 并且指定了 /EHc
1>D:\DragonheartLX\projects\Sibilla\Sibilla\MiraiCP\MiraiCP.cpp(1442,1): warning C4297: “FUNC_ENTRANCE”: 假定函数不引发异常,但确实发生了
1>D:\DragonheartLX\projects\Sibilla\Sibilla\MiraiCP\MiraiCP.cpp(1442,1): message : 函数是 extern "C" 并且指定了 /EHc
1>D:\DragonheartLX\projects\Sibilla\Sibilla\MiraiCP\MiraiCP.cpp(1495,1): warning C4297: “PLUGIN_INFO”: 假定函数不引发异常,但确实发生了
1>D:\DragonheartLX\projects\Sibilla\Sibilla\MiraiCP\MiraiCP.cpp(1495,1): message : 函数是 extern "C" 并且指定了 /EHc
明白了,参考这个 MSVC异常处理模型
我们两个开发者没有用msvc的,这种问题确实可能会遇到。MiraiCP的加载模型里假设了入口出口函数等是可能发生异常的,请务必使用/EHa,/EHs参数,相关提醒之后会加进README里面。谢谢反馈!
明白了,参考这个 MSVC异常处理模型
我们两个开发者没有用msvc的,这种问题确实可能会遇到。MiraiCP的加载模型里假设了入口出口函数等是可能发生异常的,请务必使用
/EHa,/EHs参数,相关提醒之后会加进README里面。谢谢反馈!
搞了很久,还是不行,可能是我没有配置对,对vs的了解还是不够。。。 明天我试试WSL上编译
libloader还是一样的提示吗?如果用cmake项目是否能正常加载?
都不行
另外,我还想提一点最开始libLoader没能加载,还有之前2.11.0时注意到的
_JVM_DLL_PATH是通过宏定义将jvm的绝对路径写死在程序里,这会导致不同的java安装位置需要重新编译一遍,会影响到机器人后续发布导致的配置问题
能不能考虑改为从环境变量中获取java位置?
另外,我还想提一点最开始libLoader没能加载,还有之前2.11.0时注意到的
_JVM_DLL_PATH是通过宏定义将jvm的绝对路径写死在程序里,这会导致不同的java安装位置需要重新编译一遍,会影响到机器人后续发布导致的配置问题 能不能考虑改为从环境变量中获取java位置?
其实_JVM_DLL_PATH之前测试的时候发现是不需要的,在linux和windows都测试过,已经从cmake里删掉了,今天你这个issue之后我们才加回来,但是也没有成功,所以应该是不影响的。我们认为有可能是运行时寻找jvm的依赖dll找不到,我现在提了三个方案,不知道哪个可行,如果你有空的话也请你帮忙看看:
- 去jdk路径下面找到依赖dll拷贝到工作目录下
- 把jvm的依赖dll的文件夹加入到链接PATH
- 运行时手动指定jvm 参数
java -Djava.library.path=lib_path -jar MiraiCPxxx.jar
另外,我还想提一点最开始libLoader没能加载,还有之前2.11.0时注意到的
_JVM_DLL_PATH是通过宏定义将jvm的绝对路径写死在程序里,这会导致不同的java安装位置需要重新编译一遍,会影响到机器人后续发布导致的配置问题 能不能考虑改为从环境变量中获取java位置?
libLoader的问题我们花了一晚上解决了,不是java相关的问题,而是mingw与msvc的冲突,之后会修改这部分的cmake加入静态链接
之后再仔细研究一下符号解析的问题,我倾向于这个问题也是msvc和mingw相关的问题
?__LINE__Var@?0??FUNC_ENTRANCE@@9@4JA
FUNC_ENTRANCE
FUNC_EVENT
FUNC_EXIT
参考 https://blog.csdn.net/Dontla/article/details/119949282 找到的符号
有参数__stdcall (/Gz) /EHa /EHs 进行编译
0d82d792824ffebbef2c4cb8a12a02bc7abef39d 我们这边测试过可以了,你看看这个可以用吗
以及我真的要说一句,天灭msvc,gcc大法好:)