4

我有两个库,我想调用第一个库中的例程,然后他们调用第二个库中的例程,但是由于这些符号未定义而崩溃。即使我不想调用它们,是否可以从库 XX 中说“加载这些符号”?

测试lib1.c:

#include <stdio.h>
void sub2();
void sub1() {
  printf("Called sub1\n");
  sub2();
}

测试lib2.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

如果我在调用sub2之前手动调用sub1,它可以正常工作,但我不想这样做..

4

2 回答 2

3

好的,这使它工作,但它是一个不可移植的解决方法——它只有在你的 MoarVM 是用dyncall. 似乎应该有一些面向NativeCall世界的公开功能可以便携地执行此操作。

use NativeCall;                                                                 

sub dlLoadLibrary(Str --> Pointer) is native {}                                 
dlLoadLibrary('libtestlib2.so');                                                

sub sub1() is native('testlib1') {}                                             

sub1();                                                                         

dlLoadLibrarydyncall加载动态库的方式,这显然足以解析符号。

来自@jnthn 的更好建议:

sub fake() is native('testlib2');
try fake();

fake()加载testlib2,抛出一个Exception因为fake不是该库中的真正例程,但try忽略Exception.

于 2018-03-01T02:22:15.947 回答
1

这可能有点幼稚,但问题不应该在 C 或链接器级别而不是 Perl 6 级别解决吗?我的意思是,即使在 C 代码中,sub1也行不通。为什么您期望更高级别(Perl 6)来解决较低级别代码的问题?

于 2018-03-01T07:51:51.110 回答