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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.10.2009, 02:23   #1
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию inline функции

есть динамическая библиотека, написанная на плюсах. в некоторых классах используются inline функции, которые могут вызываться как самой библиотекой, так и приложением, использующим оную. но при вызове такой функции из приложения (не из библиотеки), получаем ошибку линковщика (undeclared reference). В студии все нормально, g++ ругается.
Вопрос, как правильно поступить в данной ситуации, и может ли функция, вызываемая из библиотеки быть встраиваемой.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 16.10.2009, 08:09   #2
gnudimarik
Новичок
Джуниор
 
Регистрация: 14.10.2009
Сообщений: 2
По умолчанию

у меня gcc version 4.3.2 и такая же проблема.Только на linux,но либа кроссплатформенная.Писалась на вин.Я сделал так:

#ifdef __GNUC__
без инлайн
#else
как было
#endif

А ты давай версию g++ и полный вывод

Последний раз редактировалось gnudimarik; 16.10.2009 в 08:16.
gnudimarik вне форума Ответить с цитированием
Старый 16.10.2009, 13:23   #3
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

версия та же. моя либа тоже писалась под вин. здравый смысл мне подсказывает, что функции, которые вызываются из либы не могут быть инлайновыми (точнее это методы классов, а не просто экспортируемые функции). вот и хочу узнать, как правильно. и полный вывод чего дать?) сообщения undeclared reference?))
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 16.10.2009, 17:14   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Естественно, если функция встраиваемая, то логичный вывод, что у неё нет постоянного адреса и вызывать её нельзя ) Выход - сделать её не inline, другого не вижу )
netrino вне форума Ответить с цитированием
Старый 16.10.2009, 17:33   #5
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2netrino
тогда объясни мне, почему студия (2003/2005/2008) это хавает) да и программер, который писал эту либу был далеко не дилетантом, думаю какой то логичный смысл в этом есть
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 16.10.2009, 17:47   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

А студия так легко это хавает со всеми оптимизациями?
Попробуй скомпилить с -fkeep-inline-functions
netrino вне форума Ответить с цитированием
Старый 17.10.2009, 08:21   #7
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Если делать инлайновые функции виртуальными, то компилятор сможет их подцепить динамически, так сказать. Кроме того библиотеки придется грузить с помощью dlopen и писать обвертки для конструкторов и деструкторов.
BaronTreep вне форума Ответить с цитированием
Старый 19.10.2009, 23:46   #8
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Примерно так это выглядит:
Код:

//numeric.h

#ifndef __NUMERIC_H__
#define __NUMERIC_H__

class Numeric {
  int x, y;
public:
  Numeric(int a, int b);
  virtual int sum ();
  virtual int prod ();
  virtual double div ();
};

#endif

//numeric.cpp

#include "numeric.h"

extern "C" Numeric *create_object(int a, int b)
{
  return new Numeric (a, b);
}

extern "C" void destroy_object(Numeric *object)
{
  delete object;
}

Numeric::Numeric(int a, int b) {
  x = a;
  y = b;
}

inline int Numeric::sum () {
  return x + y;
}

inline int Numeric::prod () {
  return x * y;
}

double Numeric::div () {
  return x / y;
}

// main.cpp

#include <dlfcn.h>
#include <iostream>
#include "numeric.h"

int main(int argc, char **argv) {

  void* handle = dlopen("./numeric.so", RTLD_LAZY);

  Numeric* (*create)(int, int);
  void (*destroy)(Numeric*);

  create = (Numeric* (*)(int, int))dlsym(handle, "create_object");
  destroy = (void (*)(Numeric*))dlsym(handle, "destroy_object");

  Numeric* num = (Numeric*)create(9, 3);

  std::cout << num->sum() << std::endl;
  std::cout << num->prod() << std::endl;
  std::cout << num->div() << std::endl;

  destroy(num);
  return 0;
}
Т.е. все функции виртуальные, две инлайновые, и одна простая. Компилировать вот так:
Код:

g++ -fPIC -shared numeric.cpp -o numeric.so
g++ main.cpp -ldl -o main
В последней строчке можно и без -ldl обойтись.
BaronTreep вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чем отличается описание функции от определения функции в С++? Go6a Помощь студентам 4 18.07.2009 18:07
Функции. Передача массива в качестве параметра функции. Wia Помощь студентам 2 17.03.2009 14:57
inline asm в gcc drRobert Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 23.08.2008 10:26
ошибка в inline функции Tan4ik Помощь студентам 2 04.05.2008 21:26
inline??? пыхта4ог Общие вопросы C/C++ 2 09.11.2007 17:54