2010-06-22 3 views
4

C++ Win32 응용 프로그램으로 만든 DLL이 있습니다. 내 DLL에서 맹 글링 이름을 방지하기 위해, 내가 아래에 정의 된 내보내기 정의를 사용하고 있습니다 : 컴파일이 코드를 얻으려면extern "C"DLL : 디버그는 정상입니다. 릴리스는 C2059 오류를 throw합니다.

#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으로 설정하십시오. C++ 코드 (/ TP)으로 컴파일하십시오.

디버그 모드에서 작동하지만 릴리스 모드 설정을 디버그 설정과 동일하게 구성하더라도 모든 내보내기 기능에 릴리스 모드가 error C2059: syntax error: 'string'이됩니다.

릴리스 모드를 컴파일하려면 어떻게해야합니까?

감사합니다,
~ 조
은 (비주얼 스튜디오 2008 프로페셔널에서 개발)

편집 :
문제를 일으킬 수 나타나지 않습니다 내 #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 

그것의 모든 즉.

오류 : 릴리스 모드에서coilmodel.h
라인4

다시 말하지만,이 오류 만 나타납니다
설명error C2059: syntax error: 'string'
파일이 아닌 디버그 모드.
프로젝트는 C++ Win32 DLL 응용 프로그램입니다.

+0

게시 한 코드가 문제와 관련이 없다고 생각합니다. 해당 줄에 대한 코드를 게시 할뿐만 아니라 어떤 줄 초크를 알려주시겠습니까? 게시 된 코드에서 릴리스 모드로 정의 된 내보내기가없는 것처럼 보입니다. –

+0

위의 '수정'섹션을 참조하십시오. 나는이 모든 것을 여기서 설명 할 수 없었다. – jp2code

답변

6

경우, 사용중인 컴파일러는 C (안 C++)로 컴파일하고 extern "C"에 해당 오류가 발생합니다 :

그래서 어쩌면 이런 일을하려고합니다. 이 경우 이미 언급 한대로 /TP 스위치를 사용해야하거나 파일 이름을 .cpp으로 바꿔야합니다.

#ifdef __cplusplus 
extern "C" 
#endif 
+0

그게 다야! Mark Wilkins에게 감사드립니다! 사실, 방금 .cpp 파일의 이름을 바꿨습니다. 다시 한 번 감사드립니다! ~ Joe – jp2code

2

EXPORT은 릴리스 빌드에서 다른 것으로 정의됩니다. 정의 주위에 #ifndef이 있으므로 이미 정의 된 경우에는 아무 것도하지 않습니다. 함수 선언 시작 부분에 붙여 넣은 다른 항목 (어쩌면 문자열일까요?)이 나타납니다.

은 소스 파일이 .c 확장자가
#ifdef EXPORT 
    #error EXPORT already defined! 
#else 
    #define EXPORT extern "C" __declspec(dllexport) 
#endif 
+0

좋은 생각인데, EXPORT는 이전에 정의되지 않았습니다. 컴파일러는 "C"에 문제가있어 문자열이라고 생각합니다. – jp2code

0

Unprobable,하지만 확실히 dllexport를하거나 _stdcall는 #define에 의해 정의되지 ... : 다른 솔루션은 통근 주위 위해서 #ifdefs을 넣어하는 것입니다

1

강제로 Compile As을 C++ 코드 (/ TP)로 컴파일 - 모든 빌드 구성에서 디버그/릴리스 x 32/x64 등으로 설정 했습니까?이 옵션을 사용하지 않는 것이 좋습니다. 자동으로 선택합니다.

파일 이름이 맹 글링을 해제하는 데 C++ 인 경우 extern "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

아마 내가하지 않았지만, 나는 확실히하려고 생각했다! Visual Studio에서는 설정이 별도의 화면에 있기 때문에 디버그와 릴리스 간의 설정을 간단하게 비교할 수 없습니다. .cpp 확장자를 포함하도록 모든 * .c 파일의 이름을 변경하면 문제가 해결되었으므로 지금 다시 보지 않겠습니다! :) – jp2code