Read The Fucking Manual
요즘 내가 가장 열심히 하고 있는 행동.
AIX의 Visual Age C++ 의 컴파일 옵션을 돌파하고
SUN의 SUN WorkShop C++의 컴파일 옵션을 돌파.
결론은 MS최고.
많은 C++ 컴파일러들이 템플릿 인스턴스화에 대한 복잡한 옵션이 존재해서 STL을 썼을 때도 그냥 간단하게
CC -o a.o b.o c.o
해버리면 거의가 링킹에러가 난다.
VA C++의 경우는 모든 템플릿을 사용한 오브젝트 파일에 기본적으로 템플릿을 인스턴스화 해버려서 링킹시 똑같은 템플릿 인자를 사용한 템플릿 클래스를 여기저기서 인스턴스화가 되어 있기때문에 중복 경고를 마구 올린다.
이건 템플릿 인스턴스 중간 디렉토리를 설정해주면 템플릿의 인스턴스 코드를 따로 생성해서 해당 디렉토리에 생성하고 마지막에 링킹단계에서 해당 인스턴스 코드를 컴파일해서 링크 함으로써 중복을 해결하게 된다.(그런대 나는 컴파일러가 지가 생성한 중간 인스턴스 코드를 컴파일 하다가 에러가 나서… 그냥 옵션끄고 링킹할때마다 중복에러를 본다.)
SWS C++의 경우 라이브러리로 만들때는 위와는 반대로 인스턴스화를 안해서 링킹시에 아예 해당 심볼이 존재하지 않는다고 에러가 난다.
해결 법은 ar 로 라이브러리를 만들지 말고 CC 로 -xar 옵션을 사용해서 라이브러리로 만들면 해결. 이걸 external Instance 라고 한다. (인스턴스화 방법은 총 5가지)
MS VC++은 아무래도 하나의 프로젝트 파일로 관리가 되기 때문에 위의 문제들이 안생기던지… 아니면 그냥 중복시켜버리던지 하는것 같다.
ps.
단순히 STL같은 템플릿 클래스를 사용하는게 아니고 자기가 템플릿클래스를 따로 작성한다면 더욱 복잡해 진다.
그냥 gcc 에 g++ 깔아쓰면 바로될텐데. 원래 OS에 기본 포함된 컴파일러는 gcc 컴파일용으로 밖에 안씀.
저도 차라리 그랬으면 좋겠는데 개발서버가 아니라서 그런걸 깔기가 좀 그러내요. 계정도 제껄 따로 만들어서 쓰는게 아니라 -_-;;;
gcc는 그렇다치고 cvs 라도 깔았으면 좋겠내요.