首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NativeCall加载我未调用的库符号

NativeCall加载我未调用的库符号
EN

Stack Overflow用户
提问于 2018-03-01 02:33:08
回答 2查看 239关注 0票数 4

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

testlib1.c:

代码语言:javascript
复制
#include <stdio.h>
void sub2();
void sub1() {
  printf("Called sub1\n");
  sub2();
}

testlib2.c:

代码语言:javascript
复制
#include <stdio.h>
void sub2() {
  printf("Called sub2\n");
}

testit.p6:

代码语言:javascript
复制
use NativeCall;

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

sub1();

错误:

代码语言:javascript
复制
Cannot locate native library 'libtestlib1.so': ./libtestlib1.so: undefined symbol: sub2

如果我在调用sub1之前手动调用sub2,它会工作得很好,但我不想这样做。

EN

回答 2

Stack Overflow用户

发布于 2018-03-01 10:22:16

好的,这使它可以工作,但它是一个不可移植的变通方法--只有当您的MoarVM是用dyncall构建的时,它才能工作。似乎应该有一些向NativeCall世界公开的函数来实现这一点。

代码语言:javascript
复制
use NativeCall;                                                                 

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

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

sub1();                                                                         

dlLoadLibrary是加载动态库的dyncall方式,这显然足以让符号被解析。

来自@jnthn的更好的建议:

代码语言:javascript
复制
sub fake() is native('testlib2');
try fake();

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

票数 3
EN

Stack Overflow用户

发布于 2018-03-01 15:51:51

这可能有点天真,但问题不应该在C或链接器级别而不是Perl 6级别解决吗?我的意思是,即使在C代码中,sub1也不能工作。为什么期望较高级别(Perl6)来修复较低级别代码的问题?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49036300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档