Как указать относительный путь к библиотеке в Julia ccall? - PullRequest
1 голос
/ 16 мая 2019

до ccall пользовательской библиотеки, мне нужно записать полный путь к библиотеке в системе:

j = ccall((:add3, "[FULL_PATH]/libmylib.so"), Float32, (Float32,), 2)

Я пытаюсь использовать вместо этого относительный путь с:

j = ccall((:add3, "$(pwd())/libmylib.so"), Float32, (Float32,), 2)

но, в то время как "$(pwd())/libmylib.so" возвращает правильный путь к библиотеке, ccall с pwd возвращает TypeError: in ccall: first argument not a pointer or valid constant expression, expected Ptr, got Tuple{Symbol,String}.

Итак, как вызвать библиотеку, находящуюся в той же папкечем скрипт Julia / текущий рабочий каталог?

Я озадачен, так как согласно этот поток в Windows, кажется, работает, даже если документ для ccall указывает:

Обратите внимание, что кортеж типа аргумента должен быть буквальным кортежем, а не переменной или выражением с кортежем.

Для информации, я в Ubuntu 18.04, и библиотека былареализовано с помощью

mylib.c:

float add3 (float i){
 return i+3;
}

mylib.h:

#ifndef _MYLIB_H_
#define _MYLIB_H_

extern float get2 ();
extern float add3 (float i);

Компиляция (gcc):

gcc -o mylib.o -c mylib.c
gcc -shared -o libmylib.so mylib.o -lm -fPIC

Ответы [ 2 ]

1 голос
/ 16 мая 2019

Насколько я знаю, это наиболее часто используемый шаблон:

const mylib = joinpath(pwd(), "libmylib.so")
j = ccall((:add3, mylib), Cfloat, (Cfloat,), 2)

Обратите внимание, что pwd может быть немного больше в потоке, чем вы хотите для пути к библиотеке, вероятно, лучшесвязать его с файлом, например,

const mylib = joinpath(@__DIR__, "libmylib.so")

, где @__DIR__ раскрывается в каталог самого файла.

0 голосов
/ 16 мая 2019

Как часто, я нашел решение только после публикации на SO .. кажется, что постановка вопроса помогает лучше определить проблему ..

В любом случае, решение состоит в том, чтобы сначала получить указатель на функцию с cglobal - где я могу использовать pwd() - и затем использовать метод ccall с указателем функции:

f = cglobal((:add3, "$(pwd())/libmylib.so"))
j = ccall(f, Float32, (Float32,), i)
...