error: ISO C++ forbids declaration of ‘자료형’ with no type
-------------------------------------------------------------------------------------------
원인 : 자료형이 제대로 선언되지 않은채 사용되었다.
해결 :
1. 이 자료형이 선언된 헤더파일의 경로 및 파일이름이 올바른지 확인한다.
2. namespace안에 구현된 경우일 수도 있으니 namespace를 사용했는지 확인한다.
error: 'NullLock' was not declared in this scope
-------------------------------------------------------------------------------------------
원인 : 자료형이 제대로 선언되지 않았다.
해결 :
1. 만약 include한 파일이 include path 중에 2군대 이상 존재한다면, 첫번째 path 안에
있는 파일이 include 된다. 해결하려면 컴파일 옵션에서 include path의 순서를 바꾸
거나, using namespaceObject::Something 처럼 사용하고자 하는것만 골라서 쓰면
된다. 되도록이면 using namespace namespaceObject 처럼 모든 것을 포함시키지 말고,
using namespaceObject::something 처럼 사용하는것 하나하나씩만 끌어다 쓰도록
하자.
(예) lock.h 라는 파일이 /test/lock.h 에 있고 /test/include/lock.h에 있다고 가정하자.
컴파일 옵션은
gcc -I/test/lock.h -I/test/include/lock.h -c -o something.o something.cpp
일때 lock.h 는 처음 include 경로로 잡았던 /test/lock 의 lock.h를 읽어오게 된다.
2. name space 를 사용했는지 확인한다.
error: undefined reference to 'xxx'
-------------------------------------------------------------------------------------------
원인 : 링킹 과정중 라이브러리 파일이 잘 연결되지 못했다.
해결 :
1. 라이브러리 명과 라이브러리 경로를 확인한다.
2. 그래도 안되면 라이브러리 순서를 바꿔본다. (다른 라이브러리에 의존적이지 않은 것을
뒤에 오게한다. 반드시 뒤에 기술된 라이브러리는 앞에 기술된 라이브러리를 참조하면
안된다)
3. 1,2번이 안되는 예가 있다. 라이브러리끼리 서로 참조하는 경우에는 순서를 바꿔본들
에러는 변함없이 난다. 그런경우 다음과 같이 한다. Xlinker 는 linker 에게 옵션을 넘긴다
는 뜻이고 start ~ end-group 은 링크를 하나로 그루핑 하는 function 이다.
(예) lib1.a 와 lib2.a 가 서로 참조하는 경우 아래와 같은 옵션을 통해서 해결할 수 있다.
gcc -o exefile -Xlinker --start-group lib1.a lib2.a -Xlinker --end-group
-------------------------------------------------------------------------------------------
원인 : const로 선언한 class 에서 const 를 보장할 수 없는 함수가 호출되었다. 즉, 어떤 클래스를
(예) int attachFirstStringAfterSecondString( const string& First, const string& Second )
해결 : 우선 호출한 함수에 대해 생각해봐야 한다. 이것이 const속성을 보장해야 하는 함수인지 아닌지를 말이다. 만약 이것이 상수성을 보장해야 한다면 첫번째 방법을 써야 하고, 그렇지 않은경우 클래스를 이용할때 const로 이용하지 말아야 한다. 이것은 class design 시 신중하지 않으면 나중에 골치아픈 문제를 야기시킬수 있으므로 design step에서 신경쓰도록 하자.
- 안에서 멤버변수를 변경하는 부분을 없앤다.
(예) mutable int length_;
필요가 없는 인자 클래스를 const를 벗긴채로 사용할경우, 변경하더라도 아무런 에러를 발생
시키지 않기 때문에 좋은 코딩스타일이라고 볼 수 없다. 신중히 생각하고 const 를 벗기도록
하자.
-------------------------------------------------------------------------------------------
원인 : 어딘가에 동일한 이름의 MACRO 가 쓰이고 있다.
해결 : 빌드하는 모든 소스를 검사하여 MACRO 이름을 바꾸거나 겹치지 않게 조치를 취한다.
'Programming > C & C++' 카테고리의 다른 글
C & C++ 에서 현재 파일 이름과 줄번호를 얻어오는 방법 (0) | 2023.05.12 |
---|---|
C++ Errors (0) | 2014.11.05 |
C++ Multi Platform Issues (0) | 2014.07.01 |
Tips for C++ compiling Issues (0) | 2013.07.31 |
MSVCRTD.lib(MSVCR90D.dll) : error LNK2005: __stat64i32이(가) LIBCMTD.lib(stati32.obj)에 이미 정의되어 있습니다. (0) | 2012.11.29 |
댓글