NativeCall загружает библиотечный символ, который я не называю

У меня есть две библиотеки, я хочу вызвать подпрограммы в первой библиотеке, затем они вызывают подпрограммы во второй библиотеке, но сбой, потому что эти символы не определены. Можно ли сказать "загрузить эти символы" из библиотеки 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

Если я позвоню sub2 вручную перед звонком sub1это работает нормально, но я не хочу этого делать..

2 ответа

Хорошо, это заставляет его работать, но это непереносимый обходной путь - он работает, только если ваш 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,

Это может быть немного наивно, но разве проблема не должна решаться на уровне C или компоновщика, а не на уровне Perl 6? Я имею в виду, даже в коде C, sub1 не сработает Почему вы ожидаете, что более высокий уровень (Perl 6) решит проблемы кода более низкого уровня?

Другие вопросы по тегам