c++ 9

하위 버전 CentOS Linux에 배포할 때의 glibc, libstdc++ 라이브러리 버전 문제

배경 최근에 읽은 ‘구글 엔지니어는 이렇게 일한다.’에서 컴파일러 버전업에 대한 이야기가 나와서 예전에 작업했던 GCC 컴파일러 버전업에 대한 내용을 정리해본다. 몇 년 전 새로운 팀에 합류했을 때 서비스 중인 서버군들 중에서 C++ 구현된 서버군이 GCC 4.4.7을 사용하고 있었고, 컴파일러 버전이 낮아서 모던 C++의 시작인 C++ 11를 사용할 수 없었다. GCC 4.4.7은 C++ 0x까지 지원한다. C++ 11을 사용하려면 최소한 gcc 4.7 이상이 필요하다. 버전업 타깃은 CentOS 7 Base repo에 있는 GCC 4.8.5 버전으로 맞추고 진행했었다. 작업 당시 오랜 세월의 흔적으로 개발, 배포, 서비스 환경 등 각각 OS 버전이 달랐다. OS 버전이 다르다는 것은 OS가 기본적으로..

Dev 2022.08.17

Remote Debug via GDB/gdbserver Of CLion With Docker

이전 포스팅에서 이어지는 내용이다. 전체 프로젝트는 여기에서 받을 수 있다. 이번에는 리모트 디버그에 대해서 정리할 것이다. 공식 문서에도 소개가 잘 되어 있지만, 이 문서를 보고 바로 따라하기에는 좀 어렵다. 여기서 정리할 내용이다. Docker Compose 설정 GDB 설정 Remote Debug via GDB/gdbserver Use Remote GDB Server Use GDB Remote Debug GDB Server로 Target Process를 실행 Target Process를 실행 후에 GDB Server를 해당 PID로 Attach Dockerfile, docker-compose.yml 그리고 CMake의 build type, compile debug option, release opt..

Dev 2020.05.07

Full Remote Mode Of CLion With Docker

게으름이 이렇게 무섭다. 이걸 포스팅하겠다고 메모해 놓은 지 반년이 지났다. (이렇게 밀린 메모가 더 있다는 건 비밀이다.) 서버 개발자로 일을 하다 보면 Linux 환경만 지원하는 서버를 유지보수 해야 할 수도 있다. 아마 epoll을 사용한 서버일 것이다. 어떤 개발 환경으로 세팅이 되어 있을지는 모르겠지만, 해당 서버에 직접 들어가서 vi로 작업을 하고 make로 빌드하고 gdb로 디버깅을 해도 된다. 또는, Docker로 같은 Linux로 개발 환경을 만들고 visual studio code를 리모트로 연동해도 된다. 방법은 다양하다. 하지만, 나는 에디터나 터미널에서 vi로 작업하고 make를 실행하고 git 커맨드를 직접 사용하는 진성 개발자가 아니다. 편리한 IDE를 선호한다. vi의 손맛을..

Dev 2020.04.14

C++ 이야기 - [5] 캐스트 연산자 정리

글의 순서가 조금 이상한가? 각 캐스트 연산자를 소개하는 글이 먼저 올라가고 각 캐스트 연산자를 세부 설명하는 글이 뒤따라 하는 게 일반적인 순서일지도 모르겠다. 그다지 큰 계획을 세우고 쓰는 게 아니다 보니 순서가 조금 이상해도 이해해주기 바란다. 이미 C++ 캐스트 연산자에 대해서 좋은 글들이 많이 나와 있지만 사용하는 사람을 쉽게 볼 수는 없었기에 조금 더 쉽게 하나씩 접근하여 글을 적어보면 도움이 될까 싶어 글을 적어본 것인데 전달이 잘 되었나 모르겠다. 잠시 C 스타일의 캐스트 연산자를 보자. (타입) 표현식 [예제 1] const char* pConstCharPtr = "test"; int* pIntPtr1 = NULL; int* pIntPtr2 = NULL; int* pIntPtr3 = NU..

Dev 2007.10.22

C++ 이야기 - [4] 캐스트 연산자 reinterpret_cast

C++의 4가지 캐스트 연산자에 대한 이야기 중 네 번째다. 이번은 그중에서 reinterpret_cast 에 대해서 이야기한다. 자...이제 C++ 캐스트 연산자의 복병이 등장한다. 이전에 static_cast 이야기를 하면서 살짝 사기를 쳤다. C 스타일의 캐스팅과 가장 비슷한 기능을 하는 무적의 캐스팅은 그 이름도 복잡한 reinterpret_cast 다. 이 캐스트 연산자는 C 스타일의 캐스팅만큼은 아니지만 별반 차이 없이 무배뽀다. 캐스팅 대상을 캐스팅 타겟 타입으로 비트단위로 다시 재해석한다고 보면 된다. 다른 캐스트 연산자가 처리하지 못하고 남은 뒤치다꺼리를 모두 한다. 다만 const_cast 의 역할인 상수성을 날린다거나 하는 등의 기능은 수행하지 못한다. - reinterpret_cas..

Dev 2007.10.20

C++ 이야기 - [3] 캐스트 연산자 static_cast

C++의 4가지 캐스트 연산자에 대한 이야기 중 세 번째다. 이번은 그중에서 static_cast 에 대해서 이야기한다. static_cast 는 기본적으로 C 스타일의 캐스팅과 가장 비슷한 기능을 한다. 물론 C 스타일의 캐스팅처럼 만능은 아니다. 4가지의 캐스트 연산자로 분리된 만큼 const_cast의 역할인 상수성을 날린다거나 하는 등의 다른 캐스트 연산자의 고유 기능은 수행하지 못한다. 다른 캐스트 연산자와 같이 static_cast 도 static_cast 만의 용도가 있다. - static_cast 사용 static_cast 를 사용하기 전에 용도와 제약 사항을 확인하자. 실수형과 정수형, 정수형과 열거형등의 기본 데이터 타입 간의 변환상속관계의 클래스 계층 간의 변환런타임 타입 검사를 하지..

Dev 2007.10.14 (2)

C++ 이야기 - [2] 캐스트 연산자 dynamic_cast

C++의 4가지 캐스트 연산자에 대한 이야기 중 두 번째다. 이번은 그중에서 dynamic_cast 에 대해서 이야기한다. dynamic_cast 는 상속 관계 안에서 포인터나 참조자의 타입을 기본 클래스에서 파생 클래스로의 다운 캐스팅과 다중 상속에서 기본 클래스 간의 안전한 타입 캐스팅에 사용된다. 안전한 타입 캐스팅이란 런타임에 타입 검사를 한다는 것이며 아래에 조금 더 자세하게 나온다. const_cast와 같이 다른 용도로는 사용하지 못하며 용도가 명확하다. 참고로 dynamic_cast 를 사용하려면 기본적으로 다형성은 이해를 하고 있어야 하며 RTTI도 이해하고 있다면 이 글을 볼 필요가 없을 것이다. 객체가 위치한 메모리의 시작부분을 찾는 데도 사용된다는데 사용해 본 적이 없다. 객체를 v..

Dev 2007.10.09 (4)

C++ 이야기 - [1] 캐스트 연산자 const_cast

C++의 4가지 캐스트 연산자에 대한 이야기다. 이번은 그중에서 const_cast 에 대해서 이야기한다. 나머지도 각각 한 번에 하나씩 적어보도록 하겠다. const_cast 는 포인터 또는 참조형의 상수성(const)을 제거하는 데 사용된다. 다른 용도로는 사용하지 못하며 다른 캐스트 연산자는 상수성을 제거할 수 없다. 이렇게 정해진 용도가 명확한 것이 C++ 캐스트 연산자의 특징 중 하나다. 용도가 명확한 만큼 별도의 주석 없이 코드만으로 작성자의 의도가 쉽게 파악된다. volatile 한정자를 제거하는 데도 사용된다고 하는데 사용해본 적이 없다. 특정 스레드나 루프에서 휘발성을 제거하여 컴파일러에게 최적화를 해도 된다고 알려주는 정도로 사용할 듯싶다. - const_cast 사용 [예제 1] co..

Dev 2007.10.04