extern "C" DLL: отладка в порядке, сбрасывает ошибку Ошибка C2059 - PullRequest
4 голосов
/ 22 июня 2010

У меня есть DLL, которую я создал как приложение C32 Win32. Чтобы предотвратить искажение имени в моей DLL, я использовал определение EXPORT, определенное ниже:

#ifndef EXPORT
#define EXPORT extern "C" __declspec(dllexport)
#endif

EXPORT int _stdcall SteadyFor(double Par[], double Inlet[], double Outlet[]);

Чтобы этот код компилировался, мне нужно было зайти в Свойства проекта и установить C / C ++ Calling Convention на __stdcall (/ Gz) и установить Compile As на Compile as Код C ++ (/TP).

Это работало в режиме отладки, но в режиме выпуска выбрасывается error C2059: syntax error: 'string' на все мои функции EXPORT - даже если я настроил параметры режима выпуска так же, как параметры отладки.

Как мне получить Release Mode для компиляции?

С уважением,
~ Джо
(Разработка под Visual Studio 2008 Professional)

EDIT:
Множество комментариев о моем #define, который, похоже, не вызывает никаких проблем.

Чтобы избежать путаницы, мой заголовочный файл был переписан следующим образом:

#ifndef coilmodel_h
#define coilmodel_h

extern "C" __declspec(dllexport) int _stdcall steadyFor(double Par[], double Inlet[], double Outlet[], char* FileIn, char* FileOut);

#endif

Вот и все.

Ошибка:
Описание error C2059: syntax error: 'string'
Файл coilmodel.h
Линия 4

Опять же, эта ошибка появляется только в режиме выпуска, а не в режиме отладки.
Project - это приложение C32 Win32 DLL.

Ответы [ 4 ]

6 голосов
/ 22 июня 2010

Если ваш исходный файл имеет расширение .c, используемый вами компилятор скомпилирует его как C (не C ++) и выдаст эту ошибку на extern "C". Если это так, то вам нужно использовать переключатель /TP, как вы уже заметили, или переименовать файл в .cpp. Другое решение состоит в том, чтобы поместить #ifdefs вокруг внешнего:

#ifdef __cplusplus
extern "C"
#endif
2 голосов
/ 22 июня 2010

Я бы предположил, что EXPORT определяется как нечто другое в сборках Release.Поскольку у вас есть #ifndef вокруг вашего определения, оно ничего не будет делать, если оно уже определено, тогда вы получите что-то еще (возможно, строку?), Вставленное в начале ваших объявлений функций.

Так что, возможно, попробуйте что-то вроде этого:

#ifdef EXPORT
    #error EXPORT already defined!
#else
    #define EXPORT extern "C" __declspec(dllexport)
#endif
1 голос
/ 22 июня 2010

Принудительное Compile As для компиляции в виде кода C ++ (/ TP) - вы установили это на всех конфигурациях сборки - отладка / выпуск x 32 / x64 и т. Д. Я избегаю использовать эту опцию, намного проще назвать файл соответствующим образом дляКомпилятор выбирается автоматически.

Вам нужна только "C" часть extern "C", если файл C ++ отключает искажение имени.

Я предпочитаю размещать общий публичный заголовок, используяэтот формат, так что вы можете включить в C / C ++ внутренне или внешне.

#ifdef __cplusplus
# define NOMANGLE extern "C"
#else
# define NOMANGLE
#endif

#ifdef EXPORT_BUILD
# define EXPORT NOMANGLE __declspec(dllexport)
#else
# define EXPORT NOMANGLE __declspec(dllimport)
#endif
0 голосов
/ 22 июня 2010

Невозможно, но убедитесь, что dllexport или _stdcall не #defined ...

...