2015-01-03 2 views
2

Fortran을 배우고 있으며 나중에 사용할 수 있도록 모듈을 컴파일하려고합니다. 두 개의 번호를 요구하고 나는이가 메인 프로그램에서는모듈을 컴파일 할 때 'main'에 대한 정의되지 않은 참조

모듈에서 함수를 호출 : 내가 먼저 모듈을 컴파일 할 필요가 있기 때문에

use exponentiate 
integer::a,b 
write *, 'A' 
read *, 'a 
write *, 'B' 
read *, 'b 
write *,expo(a,b) 

(나는 그것을 밖으로 시도하지 않은, 그러나 그것은 문제가 아닙니다.)

그런 다음 다른 파일에이 코드가 있습니다.이 코드는 두 개의 숫자를 지수화하는 표준 모듈 일뿐입니다.

module exponentiate 
interface test 
    module procedure expo 
end interface 
contains 
    function expo(a,b) 
    type(integer), intent(in)::a,b 
    type(integer) expo 
    integer::temp 
    temp=a 
    do i=1,b 
     temp=temp*a 
    end do 
    expo=temp 
    end function expo 
end module exponentiate 

저는 Fortran 95 사양을 읽을 수없고 거의 쓸모가 없기 때문에 컴파일러 오류를 기반으로 구문을 파악하려고 노력해 왔습니다. 저와 일부 Wikipedia/SO 도움말을 통해 몇 가지 사항을 파악할 수 있었지만이 컴파일러 오류가 왜 나타나는지 전혀 알지 못합니다.

일부 구문 문제 또는 gfortran의 오용으로 인한 것인지 확실하지 않으므로 도움을 받으실 수 있습니다.

답변

1

반대로 옵션이 없으면 해당 컴파일러 드라이버 (및 기타 언어와 관계없이)는 완전한 프로그램이나 이와 비슷한 모든 구성 요소가 제공된다고 가정합니다. 소스 코드를 개체 코드 (컴파일 적절 함)로 컴파일하고, 이 객체 코드를 다른 지정된 객체 코드 또는 라이브러리와 링크하고 실행 파일을 생성합니다.

Fortran 프로그램의 컨텍스트에서이 프로세스는 어떤 형식의 주 프로그램없이 완료 될 수 없습니다. 많은 포트란 컴파일러가 주 프로그램을 위해 갖고있는 내부 이름은 main 또는 그 유사합니다 (변형은 대소 문자 및 추가 밑줄과 함께 존재합니다). 메인 프로그램의 결과가 컴파일러 드라이버에서 사용 가능하지 않다는 것을 보았을 것입니다.

해당 컴파일러 드라이버 (및 대부분의 경우)를 사용하면 Fortran 소스를 오브젝트 코드로 컴파일 (예 : file.f90 -> file.o)하여 -c 명령 줄 옵션을 제공 할 수 있습니다. 그런 다음 결과 파일에 오브젝트 코드를 제공하여 나중에 프로그램 실행 파일을 빌드 할 준비가되었을 때 컴파일러 드라이버를 나중에 호출 할 수 있습니다.

또는 명령 줄에서 모듈의 소스 파일 이름 뒤에 주 프로그램 이름 (다른 소스 파일의 이름)을 입력하십시오.

+0

와우, 예! 그게 효과가 있었어! 나는 다른 것들을 시도하고 gfortran 명령을 사용하여 모든 파일 (주 프로그램과 모듈 모두)을 컴파일하여 인수로 컴파일하고 문제없이 작업했습니다. 감사! 또 다른 질문입니다. 예를 들어 100 개의 모듈을 사용하는 프로그램을 어떻게 컴파일합니까? CLI에서 gfortran을 사용하면 문제가 커지지는 않습니다. –

+0

"100 개의 파일"을 의미한다고 가정합니다. 일종의 빌드 자동화 소프트웨어를 사용합니다. – IanH

관련 문제