LINUX.ORG.RU
Ответ на: комментарий от anonymous

> Обертку это как ? Можно подробнее %)

Чтобы из либы наружу торчали только функции, а не методы классов.

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

для linkera C++ либа ничем не отличается от Cшной.
Более того C++ compiler мало, чем отличается от Cшного,
просто там на первоначальном этапе выполняется процедура под названием
"name mangling", которая "превращает" методы какого-либа класса в
обычные C функциии, но имена этих функций измененны и отображают
информацию о классе, аргументах метода и т.д.
Эти правила "name mangling" различны для каждого компилятора (и даже
для разных версий одного и того же)
Чтобы узнать "mangling name" такой функции, достаточно посмотреть на
распечатку "nm имя_библиотеки".
Поэтому после линковки, C++ функцию можно вызывать из C
по ее "mangling name", но лучше, как было сказано выше, использовать
wrapper functions, чтобы не зависить от компилятора и его версии.

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

Огромное спасибо.
Вроде все прояснилось :)
Т.е по сути надо надо сделать обертку
для классов методы которых есть желание использовать
и используя extern C избежать манглинга для
того чтобы избежать гемороя с определением символов......

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

> Поэтому после линковки, C++ функцию можно вызывать из C по ее "mangling name", но лучше, как было сказано выше, использовать wrapper functions, чтобы не зависить от компилятора и его версии.

Вот я прямо сходу не помню, возможно ошибаюсь, но кажется там какие-то ещё были, сильно зависимые от компилятора, приколы со связыванием библиотек, кроме name mangling.

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

btw, не знаю, но спрашу у "экспертов" :)

и еще, почему бы не компилировать все сразу на C++?
какие на это есть ограничения?
возможно, они и есть. На пример, мне скоро предстоит подключить
C++ DLL к LabWinodws. В предварительных "переговорах" было
утверждение, что LabWinodws работает только с C компилятором ...
короче, надо разбираться.

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

написал "экспертам":

"
Hi,
probably a simple question:
how to call a C++ class method from C.
1. to write a wrapper function.
2. via method's mangling name.
3. some compiler specific tricks.
4. to compile C program with C++ compiler and
to call C++ class method directly.

I'm interesting in the #3d solution.

Thanks. Regards. Valeriy
"

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

тем временем с мест сообщают :

Valeri,

This is highly, highly non-trivial if you intend on attempting
to call a virtual function through a polymorphic pointer.

If you just want to call a method of class T as if the call were
written "obj.func()", then that is not too bad. You will need the
mangled name of the T::func() (this is compiler dependent), and you
must add an extra argument to the call in the first position which
will be the "this" pointer inside the function. C and C++ have the
same parameter passing rules so the rest of the arguments are the
same.

Warning: If the function you call can throw an exception, then you
are in big trouble!

-- Paul Russo

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