DLL: экспорт как функция C / C ++? - PullRequest
1 голос
/ 19 января 2010

Я сгенерировал DLL в Visual из кода C ++. Зависимость Уокер видит 3 функции, экспортированные как функции C.

Я создал проект SCons для генерации DLL, и 2 из 3 функций не рассматриваются как функции языка Си.

Что делает функцию видимой как функция C или, без изменения кода? Это должно быть в опциях компиляции / компоновки, но я не нашел ничего подходящего.

Перед функцией добавляется макрос: AM_LIB_EXPORT

В .h у меня есть:

#ifdef _WIN32
#define AM_LIB_EXPORT __declspec(dllexport)
#else
#define AM_LIB_EXPORT
#endif // _WIN32

Спасибо.

Ответы [ 3 ]

3 голосов
/ 19 января 2010

Что делает функцию видимой как функция C или C ++, без изменения кода?

Функция, скомпилированная компилятором C ++, автоматически становится «C ++ -функцией», и происходит преобразование имен для разрешения функций C ++, таких как пространства имен и перегрузка. Чтобы получить экспортные имена 'C', необходимо использовать вышеупомянутый квалификатор extern "C" в объявлении функции. В качестве альтернативы огромный extern "C" { .. } блок вокруг заголовка, содержащий прототипы.

Если это не решит вашу проблему, возможно, это связано с dllimport / dllexport. Если вы используете #define AM_LIB_EXPORT __declspec(dllexport) в своей сборке DLL, вам, как правило, также нужно сделать ее dllimport для приложений, ссылающихся на вашу DLL, чтобы компоновщик знал, откуда можно извлечь символы.

3 голосов
/ 19 января 2010

Это проблема искажения имени? Если вы не используете extern "C" в своих объявлениях функций, они будут искажены по имени.

0 голосов
/ 19 января 2010

Я нашел причину:

Экспорт также был добавлен как опция командной строки (/ EXPORT). В этом случае он экспортируется как функция C. Я не понимаю, почему ...

Я удалил этот дополнительный ключ командной строки.

Спасибо всем.

Я все еще не знаю, как пометить поток как "разрешенный"?

...