2013-02-19 5 views
2

OCaml에 작은 프로젝트를 작성했습니다.ocaml 컴파일 과정의 논리

./myUnionFind :

나는 두 개의 폴더가 있습니다. 내부에 파일 myUnionFind.ml이 있습니다.

./percolation. 안에는 myPercolation.mlpercolation_stats.ml의 두 파일이 있습니다.


myUnionFind.ml은 모듈로 작동합니다.

myPercolation.ml도 모듈로 작동하지만, myUnionFind.ml에 정의 된 모듈 MyUnionFind을 사용합니다.

percolation_stats.mlmyPercolation.ml을 사용합니다.

함께, 나는 또한 Batteries을 사용합니다.


나는 모두 작동하도록 컴파일하고 실행 파일 run을 얻고 싶습니다.

그러나 ?

나는 시도 다음 폴더 ./percolation 내부

, 나는 그것은 실패하고 File "myPercolation.ml", line 1, characters 0-16: Error: Unbound module MyUnionFind 말했지만, 내가 바로 해당 폴더 ../myUnionFind을 포함했다 ocamlfind ocamlc -package batteries -linkpkg ../myUnionFind/myUnionFind.ml myPercolation.ml percolation_stats.ml -o run

을 했습니까? 난 그냥 한 번 ./myUnionFind/myUnionFind.ml를 컴파일 할 경우에도


, 어떻게 그렇게하지 때마다이 할 수있는, myUnionFind.ml 다시하고 다시 컴파일됩니다?

+0

코드를 어딘가에서 사용할 수 있습니까? 가급적이면 git repo. 우리가 쏴서 문제를 일으키기 쉬울 것입니다. – rgrinberg

답변

2

myUnionFind 내부, 당신은 컴파일 단위에 myUnionfind.ml를 컴파일한다 : 이것은 컴파일 된 인터페이스를 저장하는 컴파일 구현을 저장 myUnionFind.cmo, 및 myUnionFind.cmi을 생성합니다

cd myUnionFind 
ocamlc -c myUnionFind.ml 

. MyUnionFind을 사용하는 다른 모듈은 유형 확인 유형 인 cmi에 액세스해야합니다. 여과 내부

, 당신이 다시

CD를 여과 ocamlc -I ../myUnionFind -c myPercolation.ml

을 수행하여 모듈에 myPercolation.ml를 컴파일 할 수 있습니다, 당신은 .cmo 모두를 얻을 .cmi. 컴파일러는 검색 경로에서 myUnionFind.cmi를 자동으로 찾은 후 -I 옵션 때문에 찾았습니다.

그런 다음 컴파일 할 수 percolation_stats

ocamlc -I ../myUnionFind -c percolation_stats.ml 

당신은 마지막으로 실행 구축하기 위해 함께 세 가지 결과 .cmo 링크 (모두 이전 컴파일 단위에 의존) : 당신이 배터리를 사용하는 경우 (

ocamlc ../myUnionFind.cmo myPercolation.cmo percolation_stats.cmo -o run 

을 각 명령을 ocamlfind ocamlc -package batteries으로 끝내고 연결 명령은 linkpkg으로 끝내십시오.

는이 과정을 간단하게하려면

  • ocamlbuild가 발견하고 실행을 생산하기 위해 현재 프로젝트의 모든 파일을 컴파일에 좋다. percolation 디렉토리에서 ocamlbuild percolation_stats.byte

  • 하지만 외부 라이브러리로 myUnionFind을 사용하려는 경우, 할 수있는 가장 좋은 방법은하기 쉽게하기 위해, findlib로 설치하는 것입니다 존재하는 모든 물건 실행 생성 할 수 있습니다 percolation에서 찾아서 지정하십시오. myUnionFind가 findlib 패키지, ocamlbuild -use-ocamlfind -pkgs batteries,my-union-find percolation_stats.byte (또는 .native가) 실행 파일을 얻을 충분해야 하나의 명령되면 (매우 간단)를 findlib 패키지를 만드는 방법에 대한 자세한 내용은, this older answer

  • 를 참조하십시오

+0

'linkpkg를 사용한 링크 명령 만'은 무엇을 의미합니까? –

+0

최종 실행 파일을 생성하는 연결 단계에서만 (컴파일 유닛 생성시) ocamlfind에'-linkpkg'를 말할 필요가 없습니다. – gasche

+0

확인. 3 개의 파일이 모두 변경되면 함께 컴파일하고 싶습니다. 하나씩 컴파일하는 대신에? –