OS: Ubuntu 16.04 (amd64)
Version: ns-3.26
gcc: 4.8.4
*결론부터 말하면, 소스 파일 확장자를 반드시 .cc 로 맞추자.
ns-3 에서 바로 시뮬레이션 코드를 테스트할 때 scratch 디렉토리에 소스코드를 집어넣으면 되고, 이 때 객체지향 컨셉을 적당히 쓰기 위해 하나의 클래스를 독립된 헤더와 소스 파일로 만드는 경우가 있다.
헤더와 소스 파일을 만들 때, [클래스 이름].h, [클래스 이름].cc 로 맞춰서 만들어야 하는데, 실수로 소스 파일 확장자를 cc가 아닌 cpp 또는 그외 다른 확장자로 쓰게 되면 ns-3의 waf 스크립트에서 소스 파일만 인식을 못해서 빌드 과정에서 "undefined reference to X" 에러가 발생한다.
문제는 이클립스 CPP 환경에서 ns-3를 프로젝트로 로드해 와서 scratch 폴더 내부에 클래스를 생성할 때에는 소스 파일의 확장자가 .cc이든 .cpp이든 아무 경고 메세지가 발생하지 않는다. 나도 이클립스 CPP에서 New > Class 메뉴를 통해서 자동으로 클래스를 만들면서 소스 파일 확장자가 .cpp로 만들어지는 것을 미처 인지하지 못해서 이 링크 에러를 보게 되었다.
ns-3.26/build/scratch 디렉토리를 살펴 보니 아예 내가 만든 클래스에 대한 오브젝트 파일(.o) 파일이 존재하지 않았다. 그 원인은 ns-3.26/wscript 파일에서 소스 파일을 자동으로 불러올 때 .cc 파일만 인식하게 되어 있기 때문이다.
(ns-3.26/wscript 파일 일부)
...(앞부분 생략)...
elif filename.endswith(".cc"):
name = filename[:-len(".cc")]
...(이하 생략)
wscript 파일을 고쳐서 cpp 파일도 자동 인식하도록 만들어도 되지만, 일단 ns-3에서 scratch 디렉토리에 대해서 미리 정해져 있는 컨벤션이고, 나중에 시뮬레이션 코드만 다른 컴퓨터의 다른 ns-3 버전에서 돌려야 할 때 같은 문제가 또 발생하게 되므로, 그냥 소스 파일을 .cc로 맞추는 것이 안전한 방법이 되겠다.
'Research > ns-3' 카테고리의 다른 글
ns-3 노드별 랜덤 값 다르게 설정하기: Seed 설정 (2) | 2021.01.10 |
---|---|
ns-3에서 직접 Socket 생성하고 패킷을 보낼 때 Close()의 중요성 (0) | 2018.01.07 |
퀄넷(QualNet)과 ns-3 비교 (0) | 2017.04.15 |
ns-3에서 Linux Container (LXC)를 통한 실제 프로그램 실행 시뮬레이션 결과가 절망적 ㅠㅠ (0) | 2016.10.09 |