2013-04-30 3 views
0

나는 많은 다른 기능을 포함하는 포트란 라이브러리에서 작업 중이다. 를 개발하고 더 쉽게 유지하기 위해, 나는 몇 가지 모듈로이 라이브러리를 분리 한 (예를 들어, part1.f90, part2.f90, part3.f90)이 모든 개별 모듈을 사용하여 메인 모듈 mylib.f90 :다른 모듈을 사용하여 모듈 컴파일 및 링크

module mylib 
    use part1 
    use part2 
    use part3 
    implicit none 
end module mylib 

아이디어는 다음 사용하는 것입니다 내 프로그램의이 주 모듈은 use mylib입니다. 그러나 나는이 모듈들을 컴파일하고 링크하는데 문제가있다.

모듈은 모두 포함되어 있으며 /mylib/src/ 디렉토리에 컴파일되며 이에 따라 해당 *.o*.mod 파일도 포함됩니다.

gfortran -I/mylib/src myprog.f90 -o myprog 

컴파일러가 지정된 디렉토리에서 필요한 모듈을 찾을 것으로 기대합니다. 그러나 불행히도 서브 모듈에 실제로 포함 된 함수에 대한 정의되지 않은 참조가 있다는 오류 메시지가 나타납니다.

내가 뭘 잘못하고 있니?

도움 주셔서 감사합니다.

답변

2

모듈 실행 가능 표현 ()이있는 오브젝트 파일의 링크를 생략한다고 생각합니다. -I 옵션을 사용하면 컴파일러에게 포함 파일 (.mod 파일)을 어디에서 찾을 수 있는지 알려주지 만 이미 작성한 파일 인 .o 파일을 연결하지 않는다고 말하고 있습니다. 를 연결하는 간단한 방법은 다음과 같은 라인을 따라 당신의 컴파일 명령을 편집하는 것입니다 :

gfortran -I/mylib/src -o myprog myprog.f90 /mylib/src/part1.o /mylib/src/part2.o ... 

나는 (내가 컴파일 명령 줄을 사용하면 기대 내가하지, 내가 make 사용합니까 또는 다른 빌드 시스템) 나는 .o 파일에 대한 경로를 한 번만 지정하는 방법을 알고 있습니다. 누군가는 조만간 여기에 올 것이고 그 특별한 그림에 우리 둘을 넣을 수도 있고 문서에 침입 할 수도 있습니다.

+0

답장을 보내 주셔서 감사합니다. 그러나 필자는 프로그램을 라이브러리와 연결할 때 모든 객체를 언급 할 필요성을 우회하려고했습니다. – remek

0

내가 예를 들어보고, 다른 웹 사이트에서 일부 정보를 발견 : http://fortranwiki.org/fortran/show/Library+distribution

첫 번째 방법는, 특정 위치에 *.mod 파일을 저장, 예를 모듈을 컴파일하는 것입니다 /usr/lib/fortran을 입력하고 을 사용하여 *.o 개의 파일이 포함 된 libmylib.a 파일을 만듭니다. 그런 다음 내 프로그램을 컴파일하려면 코드가 use mylib 인 코드를 발견 할 수 있도록 해당 모듈이있는 컴파일러를 나타 내기 위해 플래그 -I/usr/lib/fortran을 추가합니다. 마지막으로, 플래그 -lmylib을 사용하여 아카이브 된 라이브러리와 내 프로그램을 링크하고 아카이브 된 라이브러리가있는 곳을 나타내면 -L이됩니다.

이 접근법의 문제점은 Fortran 컴파일 모듈이 컴파일러에 종속된다는 것입니다. 이는 다른 컴파일러 또는 동일한 컴파일러의 다른 버전을 시스템에서 사용하는 경우주의해야한다는 것을 의미합니다.

두 번째 방법 인은 라이브러리의 모듈을 빌드 디렉토리에 포함하고 프로그램과 함께 컴파일하는 것입니다.

다른 모든 의견을 환영합니다!

관련 문제