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) решит проблемы кода более низкого уровня?