#devices #produced #pointers #buffer #safe #ai-m #xrk

xdrk

用于打开由AiM设备生产的XRK和DRK文件的库

1个稳定版本

1.0.0 2022年9月19日

#3 in #produced

Apache-2.0

14MB
1.5K SLoC

包含 (ELF库, 5.5MB) aim/libxdrk-x86_64.so, (ELF库, 5.5MB) aim/libmatlabxrk.so.0, (Windows DLL, 2.5MB) aim/libxdrk-x86_64.dll, (静态库, 10KB) aim/libxdrk-x86_64.lib

AiM Sportline Logo

xdrk

一个用于访问由AiM设备产生的文件的库

或者更确切地说,是一个针对由AiM提供的C/C++编写的共享库的Rust包装器,该库提供了一个不安全接口。这个包装器尽力使接口安全,确实做到了 - 但它仍然存在一个痛点,那就是必须与写缓冲区(或者如你所说,指向头分配数组的指针)打交道。然而,这个包装器也是尽可能地紧密。

总结:安全使用AiM访问XRK/DRK文件的库。

构建和测试

构建遵循标准的Rust风格

cargo build

它在Linux和Windows 64位上都能工作;在Windows上,你需要使用 x86_64-pc-windows-msvc 目标,这又要求你安装几个GB的MSVC构建工具。

测试与构建相同,但 Drop 实现测试必须单独运行,因为,嗯,AiM库执行了一些磁盘文件I/O操作,在并行运行测试时这是不可能发生的

cargo test
cargo test -- --ignored

如果你查看了 coverage.sh 文件,这是持续集成环境运行的文件,你将注意到这里,我们以单线程方式运行测试

cargo test -- --test-threads=1
cargo test -- --ignored

这样做是因为由于 grcov 所需的标志,不知何故,测试是在单独的进程中运行的(我猜?)或类似的东西 - 结果是它会破坏用于将AiM库包装在线程安全方式中所需的全局变量,并且会发生非常奇怪的错误,因此我们无法在CI中并行运行测试。如果你遇到问题,我建议你像CI一样以单线程方式运行测试,看看会发生什么。

在我们的机器上,测试在合理、小于60秒的时间范围内运行。所以如果你使用的是某种相对现代的设备,你不在Windows上,你看到过长的运行时间,那么可能有问题。在Windows上,测试运行时间比Linux长10倍,因为AiM DLL打开任何XRK/DRK文件需要10到20秒,而在Linux上这个过程几乎不需要一秒。

使用它

最好是将其声明为你的项目依赖项,通过git完成。

如果你在Windows上工作,有一些注意事项

MSVC不会将.dll文件链接起来并在之后动态加载它,但也不会“盲目”地链接共享对象并在运行时检查是否一切正常。好吧,某种程度上是这样的,因为它需要“链接”的资源只是一个包含大量混淆的符号名称的文件,然后它们仍然会在运行时再次检查(因为,好吧,实际上没有其他方法)。

就是这样。好消息是,如果您有.dll文件,您实际上可以使用微软自己的工具生成这个混淆符号文件。

要在Windows上链接AiM库,您需要一个与他们提供的.dll文件对应的.lib文件。在aim目录中包含一个,但如果出于任何原因您需要更新版本,请继续阅读。

您应该已经安装了MSVC构建工具,以与Rust的x86_64-pc-windows-msvc目标一起工作。现在再次启动您的Visual Studio安装程序并安装C++ CLI工具,或者Windows基础工具,或者Visual Studio版本中称其为这样的东西;如果您不确定,只需在Google上搜索“visual studio dumpbin”或类似组合的术语,然后继续。

现在您已经安装了另外2GB的东西™,请按照以下步骤操作

  1. 从开始菜单运行“Visual Studio命令提示符”。
  2. 导航到where/you/put/xdrk/aim
  3. 执行命令:dumpbin /exports libxdrk-x86_64.dll > libxdrk-x86_64.def此命令以文本形式打印有关给定DLL库的一些信息到其标准输出。我们将其重定向到具有DEF扩展名的文本文件。但是,要使其成为真正的DEF文件,我们需要编辑它。
  4. 在某个文本编辑器中打开libxdrk-x86_64.def并编辑它,使其只包含以下形式的导出函数名称
    EXPORTS
    function_1_name
    function_2_name
    function_3_name
    
    在此阶段,您还可能想要将DEF文件与此存储库中aim目录中提供的DEF文件进行比较。
  5. 执行另一个命令
    lib /def:libxdrk-x86_64.def /out:libxdrk-x86_64.lib /machine:x64
    

就这样!从DLL库生成的所需LIB文件。

我从互联网上偷了这个指南。像往常一样,感谢,互联网!

依赖关系

~5–7MB
~121K SLoC