|
|
|
Вызов функции из динамической библитеки в Linux
|
|||
|---|---|---|---|
|
#18+
Столкнулся со следующей проблемой: Предположим есть исходник с функцией double func(double) Делаю из него динамическую библитеку командами g++ -fPIC -c func.cpp и затем g++ -shared func.o -o libmy.so. После загрузки библиотеки пытаюсь вызвать в программе *(void **) (&func) = dlsym(handler_library, "func") - возвращается пустой указатель и ошибка "undefined symbol: func". Смотрю программой nm список функции и вижу что моя функция называется _Z6funcd... После этого пытаюсь загрузить функцию с указанным именем и все получается. Насколько я понимаю проблема изменения имени связана с параметрическим полиморфизмом. Как сделать так чтобы компилятор не изменял имена функции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2005, 09:46 |
|
||
|
Вызов функции из динамической библитеки в Linux
|
|||
|---|---|---|---|
|
#18+
up ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2005, 11:17 |
|
||
|
Вызов функции из динамической библитеки в Linux
|
|||
|---|---|---|---|
|
#18+
Тема закрыта, разобрался сам ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2005, 11:42 |
|
||
|
Вызов функции из динамической библитеки в Linux
|
|||
|---|---|---|---|
|
#18+
плз отпишись, чё было то ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2005, 11:59 |
|
||
|
Вызов функции из динамической библитеки в Linux
|
|||
|---|---|---|---|
|
#18+
IMHO extern "C" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2005, 12:20 |
|
||
|
Вызов функции из динамической библитеки в Linux
|
|||
|---|---|---|---|
|
#18+
ChameLe0nпараметрическим полиморфизмом :-) Если не выпендриваться, то можно просто - перегрузка функций. ChameLe0nПосле загрузки библиотеки пытаюсь вызвать в программе *(void **) (&func) = dlsym(handler_library, "func") Может все таки - func = (double (*)(double))dlsym(handler_library, "func"). ChameLe0nКак сделать так чтобы компилятор не изменял имена функции. Ну это, вообще, финиш. Дело в том, уважаемый, что одна из фишек Си++ - в перегрузке функций, а достигается она искажением имен, которое включает в себя кодирование передаваемых параметров. Все это для того, чтобы имя функции оставалось уникальным, потому как процессору до СИХ ПОР надо поиметь адрес на исполняемый код, а не читать мысли что вы хотите запустить. Пример перегрузки функций: void Func(void); // @Func$qv void Func(int); // @Func$qi void Func(int, int); // @Func$qii void Func(*char); // @Func$qpc void Func(unsigned); // @Func$qui (кодирование параметров функции зависит от компилятора, но логика у всех примерно такая. Эти примеры взяты из книги по C++Builder, потому как лень было опять перегружаться в Linux, ибо скоро обед :-) ) Так вот, как по Вашему функция dlsym узнает какую функцию именно вы хотите? Голого имени маловато будет. Ответ на вопрос: что бы компилятор не искажал имена функций, в следствии "параметрического полиморфизма" :-), надо писать библиотеки на Си! И, вообще, утилитки умные знаете(nm), а вот Си++ так и не изучили. man УЧЕБНИК_ПО_СИ++ ! Читать надо больше, а не по форумам лазить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2005, 12:42 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33308287&tid=2032669]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
49ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 227ms |
| total: | 377ms |

| 0 / 0 |
