我有两个库,我想调用第一个库中的例程,然后它们调用第二个库中的例程,但因为这些符号是未定义的,所以崩溃了。有没有可能说“从XX库加载这些符号”,即使我不想调用它们?
testlib1.c:
#include <stdio.h>
void sub2();
void sub1() {
printf("Called sub1\n");
sub2();
}testlib2.c:
#include <stdio.h>
void sub2() {
printf("Called sub2\n");
}testit.p6:
use NativeCall;
sub sub1() is native('testlib1') {}
sub sub2() is native('testlib2') {}
sub1();错误:
Cannot locate native library 'libtestlib1.so': ./libtestlib1.so: undefined symbol: sub2如果我在调用sub1之前手动调用sub2,它会工作得很好,但我不想这样做。
发布于 2018-03-01 10:22:16
好的,这使它可以工作,但它是一个不可移植的变通方法--只有当您的MoarVM是用dyncall构建的时,它才能工作。似乎应该有一些向NativeCall世界公开的函数来实现这一点。
use NativeCall;
sub dlLoadLibrary(Str --> Pointer) is native {}
dlLoadLibrary('libtestlib2.so');
sub sub1() is native('testlib1') {}
sub1(); dlLoadLibrary是加载动态库的dyncall方式,这显然足以让符号被解析。
来自@jnthn的更好的建议:
sub fake() is native('testlib2');
try fake();fake()加载testlib2,抛出Exception,因为fake不是该库中真正的例程,但是try忽略了Exception。
发布于 2018-03-01 15:51:51
这可能有点天真,但问题不应该在C或链接器级别而不是Perl 6级别解决吗?我的意思是,即使在C代码中,sub1也不能工作。为什么期望较高级别(Perl6)来修复较低级别代码的问题?
https://stackoverflow.com/questions/49036300
复制相似问题