C++

error LNK2019: __imp_WSAStartup

  • 원인 : ws2_32.lib 를 링크하지 않아서 발생하는 문제
  • 해결 : ws2_32.lib 를 추가

 

relocation 0 has invalid symbol index 11

  • 원인 : 빈 cpp 파일을 링킹할 때 발생하는 에러
  • 해결 : 빈 cpp 파일 제거


Little Endian & Big Endian

  • struct 의 경우 variable의 bit order 변경 뿐 아니라 variable의 순서도 바뀌게 된다. 따라서 아래와 같이 little endian에서 작성된 struct는 big endian machine 에서 역순으로 기술되어야 한다.

     

 

AIX

  • 속도적인 이슈로 인하여 char로 선언한 경우 default로 unsigned char로 동작한다.  xlc Compile Option 중 하나인  -qchar=signed 를 사용하여 gcc등의 다른 컴파일러와 같이 signed char로 동작하게 바꿀 수 있다.
  • 아래와 같은 에러가 발생한 경우 runtime 라이브러리 버전이 문제일 수 있다. xlC runtime 버전을 6.0.0.0 에서 8.0.0.0 으로 업데이트 진행하면 해결될 수 있다.

    관련링크 : IBM developerworks

HP UX

  • memory allocation 시 64bit의 경우 8byte, 32bit의 경우 4byte 단위로 alignment 를 잘 맞추어서 할당해야 한다. 구조체 생성시에도 padding 용 변수를 두어 alignment를 맞춘다. 아래 메시지는 memory alignment가 맞지 않은 경우 발생한 에러메시지의 일부를 발췌한 것이다.

     
  • memory allocation 부분에서 segfault 가 발생한 경우
    • gdb example
    • 원인 : 하나의 프로세스가 할당 가능한 데이터 세그먼트 합계를 지정하는 kernel parameter 값(maxdsiz, maxdsiz_64bit)이 작아 프로그램이 더이상 메모리를 할당하지 못하고 죽음
      • kernel parameter 확인 방법

         
      • 실제 물리 메모리 사이즈 확인 방법 (How to check Physical memory in HP-UX)

         
    • 해결 : root 권한을 이용해 해당 kernel parameter 값을 증가시킨 후 (32비트 : 2G , 64비트 : 64G로 설정하였음)  재부팅


GCC

  • Fix LD_LIBRARY_PATH at compile time”-rpath <path>”    or “-Wl,-rpath,<path>”

     

General Tips

  • Check the dependency of dynamic library ( .so file )


본인이 접한 이번 에러의 케이스는 총 2가지


2가지 모두 라이브러리에 해당하는 모듈과 그걸 이용하는 바이너리 모듈 빌드시 빌드 옵션의 차이로 인해 발생하는 에러. 빌드 방식을 통일하거나, 바이너리 모듈 빌드시 차이를 포괄할 수 있는 옵션을 사용하면 된다. 


연관 빌드 옵션


  • Runtime Library 옵션 : /MTd /MD /MT 등등 ( 참조링크 )
  • DEBUG/RELEASE 옵션


하나는, 라이브러리에 해당하는 것을 DEBUG 모드로 빌드하고 그걸로 바이너리를 만드는 빌드시스템에서는 RELEASE로 해서 에러 발생. 이는 둘다 빌드 모드를 맞춤으로 해서 해결함.


다른 하나는 Runtime Library 사용에 대한 옵션 차이로 인해 발생한 에러. 이쪽도 빌드 옵션을 맞춰서 해결하였음. 참고로 재배포 패키지 버전간 차이로 인한 오동작을 줄이기 위해 /MTd로 일괄 사용하였다.

멀티플랫폼을 고려한 빌드 시스템을 고려할 때 윈도우 쪽에서 발생할 수 있는 이슈.


윈도우 컴파일러에서 c용 컴파일러로 돌려야 하는데 CPP용의 엄격한 룰체크 기반의 컴파일러로 돌아가서 그런다. 대부분의 경우에는 파일의 확장자를 보고 자동으로 동작하지만, 제대로 동작하지 않을 경우 명시적으로 C소스파일을 지정하는 옵션( /Tc 또는 /TC )을 넣어야 한다.

Building C++ Library ......... : no 
가 나온 경우 필수 라이브러리가 설치가 안되있거나 configure에서 인식을 못하는 경우 두가지가 있다.


필수라이브러리 목록은 여기( http://thrift.apache.org/docs/install )를 참고하면 된다.


BOOST library를 기본 경로에 설치하지 않고 자기계정의 특정 디렉토리에 설정한 경우


$BOOST_ROOT에 설치된 경로를 넣고 configure  실행시 --with-boost=$BOOST_ROOT 라고 입력하면 C++ libary가 잡히게 된다.

각 프로젝트 별로 "런타임 라이브러리" 형식을 모두 맞춰야 한다. 한가지라도 틀리게 되면 연관된 모든 라이브러리가 링킹 에러를 내뱉게 된다.


Visual C++ : 솔루션 탐색기에서 프로젝트 선택 -> 마우스 우클릭 후 '속성' -> 구성 속성 -> C/C++ -> 코드생성 -> 런타임 라이브러리 의 값을 하나의 값으로 모두 통일함( 다중스레드 디버그(/MTd) 나 다중쓰레드 디버그DLL(/MDd) ) 



Error Pattern



오류 404 error LNK2005: "public: bool __cdecl std::ios_base::fail(void)const " (?fail@ios_base@std@@QEBA_NXZ)이(가) msvcprtd.lib(MSVCP80D.dll)에 이미 정의되어 있습니다.


오류 405 error LNK2005: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl std::endl(class std::basic_ostream<char,struct std::char_traits<char> > &)" (?endl@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@1@AEAV21@@Z)이(가) msvcprtd.lib(MSVCP80D.dll)에 이미 정의되어 있습니다.


오류 406 error LNK2005: "public: void __cdecl std::basic_ifstream<char,struct std::char_traits<char> >::`vbase destructor'(void)" (??_D?$basic_ifstream@DU?$char_traits@D@std@@@std@@QEAAXXZ)이(가) msvcprtd.lib(MSVCP80D.dll)에 이미 정의되어 있습니다.


오류 407 error LNK2005: "public: __cdecl std::ios_base::operator void *(void)const " (??Bios_base@std@@QEBAPEAXXZ)이(가) msvcprtd.lib(MSVCP80D.dll)에 이미 정의되어 있습니다.

오류 408 error LNK2005: "public: void __cdecl std::basic_ofstream<char,struct std::char_traits<char> >::`vbase destructor'(void)" (??_D?$basic_ofstream@DU?$char_traits@D@std@@@std@@QEAAXXZ)이(가) msvcprtd.lib(MSVCP80D.dll)에 이미 정의되어 있습니다.

class 를 작성할때 내부에서 자주 쓰는 긴 이름을 가진 자료형은 typedef로 alias 를 걸게 되는데
template class일 경우 typedef 내부에도 템플릿 인자를 써야하는 상황이 온다.
그러나 typedef 내부 인자로는 아래와 같은 template 을 허용하지 않으니...



아래와 같은 우회적인(템플릿 라이브러리들 간에 거의 표준으로 사용하는 코드라고 한다.) 사용된다.


+ Recent posts