2009-07-03 5 views
1

이전 Fortran 컴파일러 및 이전 Visual Studio (VC5)로 새 포트란 컴파일러 11 및 Visual Studio 2005로 포팅합니다. 응용 프로그램에 'C'와 포트란 코드가 모두 포함되어 있습니다. 나는 포트란 코드를 컴파일하고 server_lib.lib라는 라이브러리를 생성하고있다 (라이브러리는 경고와 함께 생성 중이다). 그리고 'C'코드에 연결한다. 응용 프로그램을 연결하는 동안 연결 오류가 발생합니다.Fortran 라이브러리의 C 언어에서 링크 오류

2>Linking... 
2>server_lib.lib(Preparx.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj) 
2>server_lib.lib(Query.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj) 
2>server_lib.lib(Utm.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj) 
2>server_lib.lib(Runvhf.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj) 
2>server_lib.lib(PFLTPV.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj) 
2>server_lib.lib(Qdesic.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj) 
2>server_lib.lib(Headach.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj) 
2>server_lib.lib(Plotky.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj) 
2>server_lib.lib(Terrain.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj) 
2>server_lib.lib(Morpho.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj) 
2>server_lib.lib(Diflos.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj) 
2>server_lib.lib(Micro.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj) 
2>server_lib.lib(OpenGL_F.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj) 
2>server_lib.lib(Violet.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj) 
2>server_lib.lib(Fieldp.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj) 
2>server_lib.lib(Step.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj) 
2>server_lib.lib(White.obj) : error LNK2005: _SERVERSTUFF already defined in server_lib.lib(Athena7.obj) 
2>.\Debug/Server.exe : fatal error LNK1169: one or more multiply defined symbols found 

위의 "serverstuff"는 server.for 파일에 정의되어 있으며이 server.for는 위의 모든 파일에 포함되어 있습니다. server.for 파일에서 아래 코드 블록을 찾으십시오. 그러나 serverstuff 변수는 server.for 파일에서 한 번만 정의됩니다.

INTEGER iErrPipe !error code for pipe i/o 
INTEGER clientIndex !index into client list 
CHARACTER*136 Buffer(17) !buffer for pipe i/o 
CHARACTER dBuffer(2313) !buffer for pipe i/o 
EQUIVALENCE(dBuffer,Buffer) 
COMMON/serverstuff/clientIndex,dBuffer 

DATA dBuffer(2313)/0/ 

왜 위의 코드에서 재 선언 오류가 발생합니까? 이전 Fortran 컴파일러와 어떻게 작동 했습니까? "COMMON/serverstuff/clientIndex, dBuffer"행에 주석을 달면 완벽하게 연결되지만 응용 프로그램이 충돌합니다 ..

포트란 언어에 대해 잘 모르기 때문에 저에게 알려주십시오.

+0

이것은 컴파일러의 버그 일 수 있습니다. 당신은 이것을 보았습니까 : http://software.intel.com/en-us/forums/intel-fortran-compiler-for-linux-and-mac-os-x/topic/56995/ – sharptooth

답변

1

공통 블록 (COMMON이라는 단어)의 의미는 어떻게 든 버전간에 변경되었습니다. 이전에 컴파일러는 여러 파일의 공통 블록을 하나의 변수로 병합해야하고 이제는 모든 .obj 파일에 변수 사본을 포함시켜야하므로 나중에 링크 오류가 발생 함을 알았습니다. 새 버전에서 공용 블록이 작동하는 방식에 대한 새 버전 설명서를 읽어야합니다. 그러면 문제를 극복하는 방법을 밝힐 수 있습니다.

+0

안녕하세요, 귀하의 회신을 보내 주셔서 감사합니다. 당신이 말했듯이, server.for는 다른 파일들에 포함되어 있습니다. 전역 변수이지만 serverstuff는 라이브러리를 링크 할 때 redecleration 문제를줍니다. 어떻게 공통 데이터를 모든 필수 파일에 포함시켜야하며 재발행 오류를주지 말아야하는 방식으로 분할 할 수 있습니까 ?? Fortran 11.0.035 컴파일러를 사용 중입니다. 내 조사에 따라 일반적인 decleration은 corret지만, 나는 그것에 대해 잘 모르겠습니다. 미리 감사드립니다 .. –

0

나는 무슨 일이 일어나고 있는지 모르지만 혼합 언어 프로그램에서 발생했던 문제는 특정 언어의 처리 나 로딩이었다. 예를 들어, C로 쓰여진 main 함수와 IO를하는 fortran 서브 루틴이 있다면, C 시스템을 사용하여 링크하면 fortran io 라이브러리가로드되지 않을 수 있습니다.

C 또는 C++에서 main 함수를 사용하면 링커가 공통 블록이 전역 변수라는 것을 알지 못합니다. 시도해 볼 수 있습니다

extern char[2313] _SERVERSTUFF; 

귀하의 기능을 수행하기 전에. 밑줄을 제거하고 SERVERSTUFF의 가능한 경우를 수행해야 할 수도 있습니다.

관련 문제