【问题标题】:NativeCall loading a library symbol I don't callNativeCall 加载我不调用的库符号
【发布时间】:2018-02-28 18:33:07
【问题描述】:

我有两个库,我想调用第一个库中的例程,然后他们调用第二个库中的例程,但由于这些符号未定义而崩溃。即使我不想调用它们,是否可以从库 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,它可以正常工作,但我不想这样做..

【问题讨论】:

    标签: raku nativecall


    【解决方案1】:

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

    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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 你是对的,它必须在C/链接器级别解决。 Perl(或者可能是 Rakudo,如果 NativeCall 更像是 Rakudo 的东西而不是 Perl 的东西)需要提供的是一种指导 C/链接器拉入正确库的方法。
      • @CurtTilmes 你在自相矛盾。如果需要在 C/链接器级别解决,则需要在不涉及 Rakudo 或 Perl 6 的情况下解决。
      • 我不知所措——C/linker 需要拉入库和符号是对的,但是 Rakudo/Perl 6 无法以所需的名称传递图书馆,你怎么建议它是可能的?当我说它必须解决时,我的意思是我们需要 VM 级别的支持,这不是严格高级别可以完成的事情,但您仍然需要一种调用它的方法。
      • 我建议您修改 C 代码以加载它需要的库。首先让它在 C 中工作。当它在 C 中工作而无需外部交互时,然后开始考虑将其与 Perl 6 集成。
      • 它在 C 中工作正常...我编译了调用第一个库的 C 程序,告诉链接器在两个库中链接,一切都很好。我们需要一种方法来告诉 perl 在这两个库中进行链接。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-04
      • 2016-07-22
      • 1970-01-01
      • 2021-05-23
      • 2015-07-28
      • 2011-09-16
      相关资源
      最近更新 更多