Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.08.2010, 19:40   #1
nowaalex
Пользователь
 
Регистрация: 22.08.2010
Сообщений: 59
По умолчанию В С компилируется, а в С++ - нет

Код:
#include <stdio.h>
#include <dlfcn.h>
#include <stdlib.h>

void ( *callfunc )();

int main()
{
   void * handle = dlopen( "/MEDIA/C++/codemaker/TEST/libctest.so.1.0", RTLD_LAZY );
 
  if ( !handle ) 
  {
        fputs ( dlerror(), stderr );
        exit( 1 );
  }
    
  callfunc = dlsym( handle, "print" ); 
 
  ( *callfunc)();
  dlclose( handle );
  return 0;
}
Если сохранить в main.c и запустить
Код:
g++ -rdynamic main.cpp -ldl
, всё сомпилится.
А если сохраинть в main.c и запустить
Код:
gcc -rdynamic main.cpp -ldl
, компилятор выведет
Код:
main.cpp: In function ‘int main()’:
main.cpp:16: ошибка: некорректное преобразование из ‘void*’ в ‘void (*)()’
Почему так и как от этого избавиться?
nowaalex вне форума Ответить с цитированием
Старый 31.08.2010, 20:16   #2
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

callfunc = (callfunc)dlsym( handle, "print" );
Carbon вне форума Ответить с цитированием
Старый 31.08.2010, 20:23   #3
nowaalex
Пользователь
 
Регистрация: 22.08.2010
Сообщений: 59
По умолчанию

Спасибо, работает, а как бы теперь сделать так, чтобы файл lib.c, из которого сейчас делается динамическая библиотека, можно было переименовать в lib.cpp и скомпилить g++? ( Сейчас выдает ошибку сегментирования )
nowaalex вне форума Ответить с цитированием
Старый 31.08.2010, 20:53   #4
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Ошибка сегментирования на каком этапе?
Carbon вне форума Ответить с цитированием
Старый 31.08.2010, 20:58   #5
nowaalex
Пользователь
 
Регистрация: 22.08.2010
Сообщений: 59
По умолчанию

main.cpp:
Код:
#include <stdio.h>
#include <dlfcn.h>
#include <stdlib.h>

typedef void ( *FuncToCall )();

int main()
{
   void * handle = dlopen( "/MEDIA/C++/codemaker/TEST/lib.so", RTLD_LAZY );
 
  if ( !handle ) 
  {
        fputs ( dlerror(), stderr );
        exit( 1 );
  }

  FuncToCall f;
  f = ( FuncToCall )dlsym( handle, "print" );
  f();
  dlclose( handle );
  return 0;
}
lib.cpp:
Код:
#include <stdio.h>
void print()
{
  printf( "THIS PRO NOW WORKS!!!!\n" );
}
Команды, выполненные в bash( по очереди ):
Код:
g++ -fPIC -c lib.cpp
g++ -shared -Wl, -soname, libctest.so.1 -o lib.so lib.o
g++ -rdynamic main.cpp -ldl
./a.out
На этапе компиляции проблем не возникает. А вот после выполнения последней команды( после вызова проги ) получается ошибка сегментирования.
nowaalex вне форума Ответить с цитированием
Старый 31.08.2010, 21:28   #6
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

можешь убрать:
-rdynamic
-Wl, -soname, libctest.so.1

добавь в lib.cpp:
Код:
extern "C" void print();
Carbon вне форума Ответить с цитированием
Старый 31.08.2010, 21:47   #7
nowaalex
Пользователь
 
Регистрация: 22.08.2010
Сообщений: 59
По умолчанию

Хехе))) А если там классы и объекты?
nowaalex вне форума Ответить с цитированием
Старый 31.08.2010, 21:50   #8
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Ну, классы ты не экспортнёшь. А для объектов не нужно.
Carbon вне форума Ответить с цитированием
Старый 31.08.2010, 21:58   #9
nowaalex
Пользователь
 
Регистрация: 22.08.2010
Сообщений: 59
По умолчанию

Спасибо, разобрался)
nowaalex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не компилируется( Katte Помощь студентам 2 08.06.2010 22:47
Правильно или нет вот в чём вопрос но ошибок нет... Alexcool Помощь студентам 2 10.01.2010 13:55
Не компилируется Alchi09 Общие вопросы C/C++ 10 03.12.2009 15:20
Нет доступа в нет для Антивирусов! Ralf_ru Операционные системы общие вопросы 4 22.10.2009 16:33