LINUX.ORG.RU

Вызов функции из библиотеки, определённой в исполняемом файле.

 ,


0

1

Под Gcc нижеследующий пример успешно компилируется и работает.

// shared.c
#include <stdio.h>

void shared_func ()
{
  puts ("shared_func() called successfully! ;-)");
  printf ("Calling test_func() from library: ");
  test_func (); // -- определена в исполняемом файле
}
// test.c
#include <stdio.h>

test_func () // -- вызывается из shared.so
{
  puts ("test_func() called successfully! ;-)");
}

void main ()
{
  printf ("Calling shared_func() from main: ");
  shared_func ();
}
#!/bin/sh

gcc -o libshared.so shared.c -fPIC -shared
gcc -o test test.c -L. -lshared
LD_LIBRARY_PATH=. ./test
Можно ли повторить данный пример под MinGW, не изменяя С-шного кода или вынос test_func() в отдельную библиотеку является необходимостью? Связано ли это с Position Independent Code или это другая проблема? Спасибо, если кто ответит.

★★★★★

Нельзя, сам несколько лет назад мучался. В линуксе это называется что-то вроде обратной линковки, под виндой не работает.

staseg ★★★★★ ()
Ответ на: комментарий от nanoolinux

Кстати, нашёл по Google:«Обратная линковка» форум с темой первого комментатора; вроде и в таком решении не видится проблем.

backbone ★★★★★ ()

Если мой склероз меня не подводит, то в винде ехе-шник может содержать экспортируемые функции. Так что теоретически как то такое собрать можно.

AF ★★★ ()
Ответ на: комментарий от AF

ехе-шник может содержать экспортируемые функции.

Пробовал при помощи dlltool генерировать .def-файл, из него .a файл (хотя смысла в этом не увидел), даже запускалось, но test_func() не вызывалась.

Сошёлся на решении при сборке с MinGW просто заменять main() -> main_call() и вызывать её из разделяемой библиотеки, а под Gcc собирать целиком исполняемый файл.

backbone ★★★★★ ()
Ответ на: комментарий от cvv

а может тебя спасет передача в аргументах указателя на ф-ю?

Там много функций, это всё применительно к GObject.

backbone ★★★★★ ()
Ответ на: комментарий от anonymous

Вот в линуксе это работает, а в венде — нет. Во всяком случае, у меня не получалось и дельных решений я так и не нашел.

staseg ★★★★★ ()
Ответ на: комментарий от backbone

А нафига тебе вообще понадобились ацкие циклические зависимости?

Даже если бы небыло проблем с компиляцией, я бы до последнего сопротивлялся такому подходу.

AF ★★★ ()
Ответ на: комментарий от AF

Upd только что потыкал палочкой в mingw. Если перед функцией написать __declspec(dllexport) и собрать из этого исходника ехе-шник, то этот ехе-шник таки будет экспортировать указанную функцию. Да, и не доверяю я чето dlltool.

AF ★★★ ()
Ответ на: комментарий от AF

Тут в примере исполняемый файл линкуется с библиотекой, в программе - библиотека подгружаемая (плагин). Фактически, тут одна зависимость библиотеки от исполняемого файла. Это host-interface, если я правильно его называю. Пример взят из программы Shotwell, но полагаю, не только там такое можно найти. Одним словом, «это не бага, это фича». В общем, вынес исполняемый файл в библиотеку, всё скомпилировалось и работает.

backbone ★★★★★ ()
Ответ на: комментарий от backbone

Фактически, тут одна зависимость библиотеки от исполняемого файла.

Ошибка!

Правильно будет так: Исполняемый файл зависит от библиотеки ч-з shared_func, а библиотека от исполняемого файла ч-з test_func.

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

AF ★★★ ()
Ответ на: комментарий от AF

Исполняемый файл не зависит от плагинов, так как может работать без них. Передача по указателю превратит приятный процесс в ад, так как модель GObject создаст большое количество функций, помноженное на число поддерживаемых приложением ABI. Плюс к этому, если я правильно это всё понимаю, работа через указатели на функции (в Vala они называются delegate-ами) сложнее.

backbone ★★★★★ ()
Ответ на: комментарий от backbone

Исполняемый файл не зависит от плагинов, так как может работать без них.

Что-то ты меня запутал! В примере зависимость есть, а теперь говоришь, что её нет.

AF ★★★ ()
Последнее исправление: AF (всего исправлений: 1 )
Ответ на: комментарий от AF

Тут в примере исполняемый файл линкуется с библиотекой, в программе - библиотека подгружаемая (плагин).

- это мои слова выше. Для краткости пример такой привёл, задача всё-равно та же самая.

backbone ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.