Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
pEntity
13 / 8 / 1
Регистрация: 12.12.2012
Сообщений: 455
#1

Как верно экспортить функцию? - C++

20.01.2014, 14:12. Просмотров 2102. Ответов 45
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
#define _DECLARATOR_ __declspec(dllexport)
 
 
_DECLARATOR_ void __cdecl SumFunc()
{
    return;
}
C++
1
2
3
.text:10001000 ; void __cdecl SumFunc(void *__formal, void *__formal)
.text:10001000                 public ?SumFunc@@YAXXZ
.text:10001000 ?SumFunc@@YAXXZ proc near


__cdecl должно было удалить лишнии символы в стеке О_о

______________________________________________________________________________

C++
1
2
3
4
extern "C" void __declspec(dllexport) SumFunc()
{
    return;
}
C++
1
2
3
.text:10001000 ; void __cdecl SumFunc(void *__formal, void *__formal)
.text:10001000                 public _SumFunc
.text:10001000 _SumFunc        proc near
В этом варианте с __cdecl так же ничего не измениться.

________________________________________________________

C++
1
2
3
4
void __declspec(dllexport) SumFunc()
{
    return;
}
C++
1
2
3
.text:10001000 ; void __cdecl SumFunc(void *__formal, void *__formal)
.text:10001000                 public ?SumFunc@@YAXXZ
.text:10001000 ?SumFunc@@YAXXZ proc near

Так как же верно экспортить? Для чего extern "C" ? __declspec(dllexport) пихать перед void или после ? Как сделать, чтоб имя было без любых доп символов ?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2014, 14:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как верно экспортить функцию? (C++):

Задача логические функции (составить функцию, которая определяет верно ли что сумма цифр числа четное число) - C++
Помогите нужно составить функцию, которая определяет верно ли что сумма цифр числа четное число. обязательно использовать логическую...

Перегрузка операций (Создать класс вещественных чисел (double); определить оператор +, как функцию-элемент и – как дружественную функцию) - C++
помогите решить пожалуйста Задание 2. Бинарная операция Создать класс вещественных чисел (double).. Определить оператор +, как...

Как правильно вызвать функцию с указателем на другую функцию как параметр - C++
Вот вариант: double f(double x) { ... } double k(double (*f)(double), double y) { ...

Как верно перевести формулу на язык c++? - C++
Приветствую! Столкнулся с такой задачей в университете на 1 курсе... нужно сделать лабораторную работу с программой на с, подробности во...

Как верно узнать размер указателя ? - C++
СBaseTest* pTest = { new СBaseTest, new СOther }; Нужно узнать размер pTest

как мне функцию одного класса в функцию базового вставить - C++
как мне функцию одного класса в функцию базового вставить??чет не хера не получается.... class Car { public : void...

45
HighPredator
5560 / 1873 / 350
Регистрация: 10.12.2010
Сообщений: 5,492
Записей в блоге: 3
21.01.2014, 16:18 #31
Цитата Сообщение от Avazart Посмотреть сообщение
Когда это Си- ф-ции искажались
В моем понимании всегда. Они все имеют нижнее подчеркивание в начале. Так записано у меня по крайней мере. К тому же теория говорит о том, что соглашение Си функций cdecl дает функцию вида _MyFunct, stdcall -- _MyFunct@4, fastcall -- @MyFunct@4. Число с потолка. Поправьте где не прав.

Добавлено через 6 минут
Цитата Сообщение от Avazart Посмотреть сообщение
А если грузим динамически ?
Так логика от этого не меняется. GetProcAddr все равно требует точность в имени функции.
0
Убежденный
Ушел с форума
Эксперт С++
15787 / 7224 / 1138
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
21.01.2014, 16:52 #32
Цитата Сообщение от pEntity Посмотреть сообщение
Я тоже на 13 проверил уже. Все работает, а на 12 подчеркивает.
Проверил на VS2012 Professional:
Вывод утилиты dumpbin:
Код
Section contains the following exports for mylib2.dll

    00000000 characteristics
    52DE5E6C time date stamp Tue Jan 21 03:47:56 2014
        0.00 version
           1 ordinal base
           1 number of functions
           1 number of names

    ordinal hint RVA      name

          1    0 00001000 SomeFunc2
Никакого подчеркивания снова нет.
Функция определена так:
C++
1
2
3
4
5
6
7
8
extern "C"
__declspec(dllexport)
int
_cdecl
SomeFunc2(int, int)
{
    return 456;
}
0
HighPredator
5560 / 1873 / 350
Регистрация: 10.12.2010
Сообщений: 5,492
Записей в блоге: 3
21.01.2014, 17:42 #33
Контрпример (см. скрин). Я ранее написал, что все зависит от компилятора. Какой-то подавит, какой-то нет. Теоретических предпосылок к гарантированному подавлению нет. Полное подавление гарантируется деф файлом.
0
Миниатюры
Как верно экспортить функцию?  
Avazart
Эксперт С++
7433 / 5472 / 310
Регистрация: 10.12.2010
Сообщений: 24,391
Записей в блоге: 17
21.01.2014, 17:50 #34
HighPredator, О_у это же С++Builder это чисто его прибабаха добавлять подчеркивание при чем если не ошибаюсь
эту опцию добавления можно убрать в настройках среды.
Кроме того _ вряд ли можно считать декорированием.

Мы же ту вроде говорим про VC++ и в случае ТС с его соглашением вызова не должно быть подчеркиваний и вообще искажений.

Добавлено через 3 минуты
Цитата Сообщение от HighPredator Посмотреть сообщение
Полное подавление гарантируется деф файлом.
Блин, еще раз - def ничего не подавляет в DLL просто добавляет псевдоним.
0
HighPredator
5560 / 1873 / 350
Регистрация: 10.12.2010
Сообщений: 5,492
Записей в блоге: 3
21.01.2014, 17:59 #35
Честно уже устал повторять...
Цитата Сообщение от Avazart Посмотреть сообщение
с его соглашением вызова не должно быть подчеркиваний и вообще искажений
there is no standard specification for name decoration, the name of an exported function might change between compiler versions
Ссыль. http://msdn.microsoft.com/en-us/library/a90k134d(v=vs.80).aspx

Добавлено через 4 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
Блин, еще раз - def ничего не подавляет в DLL просто добавляет псевдоним.
Да какая разница каким словом я это обозвал? Суть то одна.
0
Avazart
Эксперт С++
7433 / 5472 / 310
Регистрация: 10.12.2010
Сообщений: 24,391
Записей в блоге: 17
21.01.2014, 18:09 #36
Цитата Сообщение от HighPredator Посмотреть сообщение
Где ты там видел про подчеркивание и про Си ?

Добавлено через 3 минуты
This convenience is most apparent when trying to export decorated C++ function names. Because there is no standard specification for name decoration, the name of an exported function might change between compiler versions. If you use __declspec(dllexport), recompiling the DLL and dependent .exe files is necessary only to account for any naming convention changes.
Ключевое слово C++ function, а не то что может зависеть от компилятора.

Добавлено через 1 минуту
Шагаем далее http://msdn.microsoft.com/en-US/library/wf2w9f6x%28v=vs.80%29.aspx

If you have functions in a DLL written in C++ that you want to access from a C-language module, you should declare these functions with C linkage instead of C++ linkage. Unless otherwise specified, the C++ compiler uses C++ type-safe naming (also known as name decoration) and C++ calling conventions, which can be difficult to call from C.

To specify C linkage, specify extern "C" for your function declarations. For example:

extern "C" __declspec( dllexport ) int MyFunc(long parm1);
0
HighPredator
5560 / 1873 / 350
Регистрация: 10.12.2010
Сообщений: 5,492
Записей в блоге: 3
21.01.2014, 18:17 #37
Цитата Сообщение от Avazart Посмотреть сообщение
это же С++Builder это чисто его прибабаха добавлять подчеркивание
Не для функций. http://www.agner.org/optimize/calling_conventions.pdf Раздел 8.2 Borland name mangling.

Добавлено через 4 минуты
dllexport of a function exposes the function with its decorated name. For C++ functions, this includes name mangling. For C functions or functions that are declared as extern "C", this includes platform-specific decoration that's based on the calling convention. If you don't want name decoration, use a .def file (EXPORTS keyword)
http://msdn.microsoft.com/en-us/library/3y1sfaz2.aspx

Добавлено через 3 минуты

Не по теме:

Avazart, можно было сразу ссылку спросить, а не троллить меня две страницы. Некрасиво.

0
Avazart
Эксперт С++
7433 / 5472 / 310
Регистрация: 10.12.2010
Сообщений: 24,391
Записей в блоге: 17
21.01.2014, 18:17 #38
For C functions or functions that are declared as extern "C", this includes platform-specific decoration that's based on the calling convention.
Речь про VC++, c эти соглашением что у ТС подчеркивания не должно быть ...

Что касается def файла, то с генерённый на его основе lib тоже не будет зависеть от компилятора.
0
Убежденный
Ушел с форума
Эксперт С++
15787 / 7224 / 1138
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
21.01.2014, 18:28 #39
Цитата Сообщение от HighPredator Посмотреть сообщение
Контрпример (см. скрин). Я ранее написал, что все зависит от компилятора. Какой-то подавит, какой-то нет. Теоретических предпосылок к гарантированному подавлению нет.
Совершенно верно. name mangling, как и вообще двоичный интерфейс C++ - штука
не стандартизированная и может отличаться даже в рамках одного компилятора.
Поэтому я еще на первой странице написал:
Чтобы в Visual C++ получить неискаженное имя, нужно или использовать DEF-файл, или
extern "C" + _cdecl.
На счет других компиляторов - не знаю, с ними особо не работал.
У М. Уилсона в его книге "Imperfect C++" этот вопрос, кстати, дотошно разбирался,
вплоть до приведения "таблиц совместимости".
0
HighPredator
5560 / 1873 / 350
Регистрация: 10.12.2010
Сообщений: 5,492
Записей в блоге: 3
21.01.2014, 18:30 #40
Цитата Сообщение от Avazart Посмотреть сообщение
не должно быть ...
Это лирика.
Цитата Сообщение от Avazart Посмотреть сообщение
Что касается def файла, то с генерённый на его основе lib тоже не будет зависеть от компилятора.
Этот файл вообще нужен только на этапе компоновки. Компилятор тут никаким боком.
0
Avazart
Эксперт С++
7433 / 5472 / 310
Регистрация: 10.12.2010
Сообщений: 24,391
Записей в блоге: 17
21.01.2014, 18:47 #41
Цитата Сообщение от HighPredator Посмотреть сообщение
Это лирика.
О таблице совместимости, я ее приводил для обоих компиляторов в начале:

Соглашение о вызове VC++ C++ Builder
__stdcall _MyFunction@4 MyFunction
__cdecl MyFunction _MyFunction

Цитата Сообщение от HighPredator Посмотреть сообщение
Этот файл вообще нужен только на этапе компоновки. Компилятор тут никаким боком.
Во-вторых, объектные двоичные файлы (.obj и .lib), создаваемые BCB, несовместимы с объектными файлами VC, и, следовательно, не могут быть прилинкованы к VC-проекту. Это означает, что при желании использовать неявное связывание (linking) c dll необходимо каким-то образом создать .lib-файл (библиотеку импорта) формата, которого придерживается Microsoft.
http://www.rsdn.ru/article/devtools/bcbdll.xml
0
HighPredator
5560 / 1873 / 350
Регистрация: 10.12.2010
Сообщений: 5,492
Записей в блоге: 3
22.01.2014, 15:58 #42
Ну собственно я не успокоился и нашел вот что. Есть такой мануал: http://agner.org/optimize/calling_conventions.pdf в котором есть следующее (заскринил две страницы). Если кратко, то суть в том, что манглирование это не только платформо-специфичная вещь как говорилось ранее, но и компилятор-специфичная. Исходя из таблицы действительно, как и было сказано на мсдн, реально избежать манглирования можно только с помощью деф файла.
0
Миниатюры
Как верно экспортить функцию?   Как верно экспортить функцию?  
Avazart
Эксперт С++
7433 / 5472 / 310
Регистрация: 10.12.2010
Сообщений: 24,391
Записей в блоге: 17
22.01.2014, 16:22 #43
А что тут нового ? Смотрим в таблицу видим что при extern "C" _сdecl и компиляторе Microsoft нет подчеркивания.

Не по теме:

P.S: Хм думал что под платформой подразумевается именно компилятор/разрядность ведь dll только по Windows вроде...

0
HighPredator
5560 / 1873 / 350
Регистрация: 10.12.2010
Сообщений: 5,492
Записей в блоге: 3
22.01.2014, 16:26 #44
Цитата Сообщение от Avazart Посмотреть сообщение
и компиляторе Microsoft нет подчеркивания
В 64 битном нет. В 32 битном да.
0
Avazart
Эксперт С++
7433 / 5472 / 310
Регистрация: 10.12.2010
Сообщений: 24,391
Записей в блоге: 17
22.01.2014, 16:48 #45
Ну у меня как раз 32битка, специально скомпилил проект в MSVC++2010 - нет там никакого подчеркивания
0
22.01.2014, 16:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.01.2014, 16:48
Привет! Вот еще темы с ответами:

Как сделать, чтобы 2 одинаковых перегруженных оператора выполнялись верно - C++
Всем привет! Столкнулся с такой ситуацией, что мне понадобилось использовать 2 перегруженных одинаковых оператора, все конечно же...

не могу разобраться как написать функцию сортировки и исправить функцию добавления в стек - C++
#include <iostream> #include<Windows.h> using namespace std; struct NE{ int x; NE *pnext,*ppor,*cur;}; class SPISOK { NE...

Как передать указатель на функцию в функцию - C++
И как с ней работать?

Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив) - C++
Изучаю c++ по одной книжке.Она говорить не умеет.. Так вот понадобилось написать функцию,которая как параметр получает указатель на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
45
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.