Связывание с несколькими версиями библиотеки

Если бы вся структура контейнера была основана на процентах, это было бы поведением по умолчанию, можете ли вы предоставить более конкретный пример?

Ниже приведен пример того, что я имею в виду, если вся ваша родительская иерархия была% основанная, любая регулировка окна браузера будет работать без каких-либо дополнительных js / css, это не возможно с вашим расположением?

<div style="width: 100%;">
   <div style="width: 50%; margin: 0 auto;">Content</div>
</div>
30
задан YerBlues 12 July 2010 в 22:36
поделиться

3 ответа

Спасибо за все ответы. У меня есть решение, которое, похоже, работает. Вот проблема в деталях с примером.

В главном.c у нас есть:

#include <stdio.h>

extern int foo();

int bar()
{
    printf("bar in main.c called\n");
    return 0;
}

int main()
{
    printf("result from foo is %d\n", foo());
    printf("result from bar is %d\n", bar());
}

В foo.c у нас есть:

extern int bar();

int foo()
{
    int x = bar();
    return x;
}

В баре.c у нас есть:

#include <stdio.h>

int bar()
{
    printf("bar in bar.c called\n");
    return 2;
}

Compile bar.c и foo.c:

$ gcc -fPIC -c bar.c
$ gcc -fPIC -c foo.c

Добавить bar.o в статическую библиотеку:

$ ar r libbar.a bar.o

Теперь создайте разделяемую библиотеку с помощью foo.o и свяжите со статическим libbar.a

$ gcc -shared -o libfoo.so foo.o -L. -lbar

Скомпилируйте main.c и свяжите с разделяемой библиотекой libfoo.so

$ gcc -o main main.c -L. -lfoo

Установите LD_LIBRARY_PATH, чтобы найти libfoo.so и запустить main:

$ setenv LD_LIBRARY_PATH `pwd`
$ ./main
bar in main.c called
result from foo is 0
bar in main.c called
result from bar is 0

Обратите внимание, что вызывается версия bar в main.c, а не версия, связанная с разделяемой библиотекой.

В main2.c у нас есть:

#include <stdio.h>
#include <dlfcn.h>


int bar()
{
    printf("bar in main2.c called\n");
    return 0;
}

int main()
{
    int x;
    int (*foo)();
    void *handle = dlopen("libfoo.so", RTLD_GLOBAL|RTLD_LAZY);
    foo = dlsym(handle, "foo");
    printf("result from foo is %d\n", foo());
    printf("result from bar is %d\n", bar());
}

Compile and run main2.c (обратите внимание, что нам не нужно явно ссылаться на libfoo.so):

$ gcc -o main2 main2.c -ldl
$ ./main2
bar in bar.c called
result from foo is 2
bar in main2.c called
result from bar is 0

Теперь foo в панели вызовов разделяемой библиотеки в разделяемой библиотеке и главной панели вызовов в main.c

Я не думаю, что такое поведение интуитивно понятно и больше работы для использования dlopen/dlsym, но это решает мою проблему.

Еще раз спасибо за комментарии.

16
ответ дан 27 November 2019 в 22:49
поделиться

К сожалению, нет. Мое понимание того, как работает Linux (и, возможно, большинство *nix), заключается в том, что это невозможно. Единственное "решение" вашей проблемы, которое я могу придумать, это если вы создадите прокси-приложение, которое передаст то, что вам нужно от libbar в виде некоторого IPC. Затем вы можете заставить этот прокси загрузить нужную версию, используя LD_LIBRARY_PATH или что-то подобное.

2
ответ дан 27 November 2019 в 22:49
поделиться

Попробуйте сделать частичную ссылку, чтобы у вас был объектный файл "partial.o" с libbar и libfoo-Y. Используйте objcopy с "--localize-symbols ", чтобы сделать символы в partial.o из libfoo-Y локальными. Вы должны быть в состоянии сгенерировать, запустив nm на libfoo-Y и обработав вывод. Затем возьмите модифицированный partial.o и свяжите его с вашим приложением.

Я делал нечто подобное с gcc toolchain на vxWorks, где динамические библиотеки не являются осложнением, но две версии одной и той же библиотеки нужно было чисто линковать в монолитное приложение.

6
ответ дан 27 November 2019 в 22:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: