问题标签 [perl-xs]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - XS 此代码中的内存泄漏?
无法在此代码中找到发生内存泄漏的位置。
基本上我想为一个返回二维数组的 C 函数编写一个 XS 包装器。
C函数:
XS 包装:
从 XS 返回一个“数组数组”。
在 Perl 脚本中进行测试:
每次returnArray()
调用该函数时,Perl 进程的 Commit 大小都会增加。但我希望$arrayref
变量每次都应该被垃圾收集,并且内存使用量不应该增加。
我希望,我正在释放 XS 中所有分配的内存。但是仍然存在内存泄漏。这个内存泄漏的 XS 代码有什么问题?
c++ - 有没有一种简单的方法可以将 json SV 或 C++ 字符串转换为 HV
我的 C++ 类中有一个 json 字符串,我将其转换为 SV 并作为标量返回到我的 perl 模块。我正在解析这个标量并将其转换为我的 perl 模块中的 json。
相反,我想在我的 C++ 类本身中将 json 字符串转换为 HV 或 perl 散列,并将其作为 perl 散列返回给我的 perl 模块。有没有一种简单的方法可以做到这一点。
我终于想把这个 json c 字符串转换为 JSON 对象;
例子:
在我的 test.cpp 我有
我将其转换为 SV(perl 标量)并将其发送到我的 perl 脚本。
在我的 test.pl 中,我使用 JSON::XS 将其编码和解码为 perl hash 或 json。
实际上,我正在寻找的是将 json 编码的 c++ 字符串转换为原生 json 并将其返回到我的 perl 模块。我不确定这是否可能。我知道的一种解决方案是解析 json 编码字符串并将其转换为 perl 哈希并将其发送到 perl 模块,然后 perl 模块将其转换为本机 json。但在这种情况下,解析 json 编码的 c++ 字符串的成本很高,因为我的字符串可能是一个非常长的 json 结构。
但不是这个
- 有没有一种简单的方法可以从我的 c++ 文件中返回一个 perl 哈希($perl_hash_or_arrayref)。
- 或从 c++ 文件返回 json($perl_hash_or_arrayref)。
提前致谢!!
c - 使用 perl XS 链接到 C 共享库
我是 PERL XS 的新手,并且有一个关于调用用 Ansi C 编写的共享库 (.so) 的问题。我似乎找不到任何好的例子来说明如何做到这一点。我浏览了位于此处的教程以开始使用(Hello World 等):
http://www.lemoda.net/xs/perlxstut/
我想修改它以调用 C 共享库中名为 cpro_supported 的函数。
libpmap.so:
以下是一些基础知识:
生成文件.PL:
使用“.so 文件的 -L 路径”修改了 LIBS 参数,但这似乎没有帮助。
测试.xs:
测试.t:
当我运行 make test 时,我收到以下错误:
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t t/test.. ..
无法为模块测试加载“/home/johnm/tmp/test/blib/arch/auto/test/test.so”:/home/johnm/tmp/test/blib/arch/auto/test/test.so :未定义符号:cpro_supported at /usr/lib/perl5/5.8.5/i386-linux-thread-multi/DynaLoader.pm line 230. at t/test.t line 9
在 t/test.t 第 9 行的 require 编译失败。
BEGIN failed - 编译在 t/test.t 第 9 行中止。看起来你的测试在它可以输出任何东西之前就死了。t/test..dubious 测试返回状态 255 (wstat 65280, 0xff00) 死亡。失败的测试 1-10 失败的 10/10 测试,0.00% 好的
失败的测试统计 Wstat Total Fail 失败的失败列表
t/test.t 255 65280 10 20 200.00% 1-10 失败的 1/1 测试脚本,0.00% 可以。10/10 分测试失败,0.00% 没问题。
制作:* [test_dynamic] 错误 2
关于这里缺少什么的任何想法?
谢谢!!
c - 使用 Perl 的 ExtUtils::MakeMaker,如何使用与 XS 模块相同的设置来编译可执行文件?
给定一个使用 C 库的 Perl XS 模块,假设有一个正确设置的 Makefile.PL,以便所有头文件和库位置、编译器和链接器标志等都能正常工作。
现在,假设我想包含一个带有所述 XS 模块的小型 C 程序,该模块使用相同的底层 C 库。指定目标可执行文件以便使用相同的设置和标志构建它的正确、独立于平台的方法是什么?
如果我执行以下操作
我没有得到我在参数中设置的包括位置、库列表等WriteMakefile
。如果我开始手动编写规则,我必须至少考虑make
、dmake
和nmake
。如果使用ExtUtils::CBuilder,我想不出一种直接的方法来指定要链接的库。
我肯定错过了什么。如果您能指出来,我将不胜感激。
perl - 如何从 Perl XS 模块调用不同 C 源文件中的函数?
我正在用 Perl 构建一个 XS 扩展。我有两个文件:
- AC 头文件 (
.h
) - AC 源文件 (
.c
)
目前我所做的是将所有 C 文件代码Model=
放在 XS 文件之前,并将我想要的函数包装在Model=
.
编译没有问题,我可以从 perl 调用特定的函数。
但我想将.xs
文件与 C 文件分开。
我希望.xs
文件只包含包装函数,这些函数将调用.c
文件上的函数,但是当我这样做并运行dmake
命令时,我得到错误代码 129 undefined reference to 'parse.c' file。
我尝试使用 WriteMakerFile 的 C 和 OBJECT 属性包含 .c 文件,但仍然收到错误消息,知道如何将 xs 文件拆分为 2 个一个 c 文件,另一个 xs 包装了作为 .c 文件一部分的 c 函数使用ExtUtils::MakeMaker。
示例将不胜感激。
cmake - 如何在编译时使用程序的退出状态?
这个问题是我上一个问题的后续:如何将这种源生成器集成到 CMake 构建链中?
目前,从 XS 生成 C 源文件是这样的:
该GENERATED
属性让 cmake 在配置时不检查此源文件的存在,并add_custom_target
让xsubpp
每次编译时总是重新运行。总是重新运行的原因是因为xsubpp
即使失败也会生成一个不完整的源文件,所以整个编译有可能以一个不完整的源文件继续。
我发现总是重新运行源代码生成器并重新编译它很耗时。所以我想让它仅在修改依赖的 XS 文件时重新运行。但是,如果这样做,则必须删除不完整的生成源文件。
所以我的问题是:有什么办法可以删除生成的文件,只有当程序在编译时异常退出?
或更通用:有没有办法根据另一个命令在编译时的退出状态来运行命令?
c - Solve warning: passing 'const void *' to parameter of type 'AV *'
Compiling an XS-module including libmba I cannot solve this warning with my beginners level experience in C:
The compiled module is working fine. But is there a way to code it without warning?
The relevant parts in LCS/XS.xs:
The part of mba/diff.h
And in mba/diff.c:
Is there a good practice to solve this warning without changing the source of libmba?
SOLVED:
perl - 如何在 Perl XS 中处理哈希值类型
我需要处理哈希值取决于值类型。这是有问题的代码:
如果我不使用注释行,我会遇到标量值问题。例如,以下哈希{a => "b", c => {d => "e"}}
是产生输出:
所以这是我的问题:
- 我们是否总是有从返回的引用,
hv_iternextsv()
或者有时它返回标量? - 为什么我看不到 key 的标量值输出
a
。
更新。
我的错误是使用hv_iternextsv()
. 我一直在想这总是一个参考。以下是工作代码的样子:
c++ - 是否可以调试包含 XS 部分的 Perl 以查看程序流程?
我有一个用 Perl 编写的项目,其中 XS 组件用 C++ 编写。我正在使用类似的命令进行调试
如何使用调试器从 Perl 跳转到那些 C++ 文件?
perl - Perl XS 垃圾回收
我不得不处理我公司中一个非常古老的代码库,它通过 perl 公开了 C++ api。
在代码审查中,我建议有必要对在 c++ 中分配的内存进行垃圾收集。
这是代码的骨架:
Perl xs 定义:
所以,我有一条评论说,在 c++ 函数中创建的内存不会被 Perl 垃圾收集。并且 2 个 java 开发人员认为它会崩溃,因为 perl 会垃圾收集 c++ 分配的内存。我建议了以下代码。
我在这里错了吗?
我还运行了这段代码,并向他们展示了内存利用率的增加,无论有没有 CLEANUP 部分。但是,他们要求提供确切的文件来证明这一点,但我找不到。
Perl 客户端:
C++ 代码:
XS码: