개요 본 글에서는 CMake를 이용하여 빌드할 때, 디렉토리를 생성하는 방법을 소개한다. 본 글에서 사용된 환경은 다음과 같다. CMake 실행 및 빌드 환경 : 우분투 리눅스 18.04 CMake 버전 : 3.13.2 CMakeLists.txt에 디렉토리 생성 명령문 작성하기 CMakeLists.txt 파일에 add_custom_command() 명령문을 작성하여, 타겟 빌드 시에 디렉토리를 생성할 수 있다. 예를 들어 빌드 결과 파일을 특정 디렉토리를 생성하여 복사하고자 할 때 사용할 수 있다. add_custom_command(TARGET ${TARGET} POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory ${DIR}) 위 명령문에서 작성자의 의도에 따..
개요 본 글에서는 CMake를 이용하여 빌드할 때, 특정 파일을 삭제하는 방법을 소개한다. 본 글에서 사용된 환경은 다음과 같다. CMake 실행 및 빌드 환경 : 우분투 리눅스 18.04 CMake 버전 : 3.13.2 CMakeLists.txt에 삭제 명령문 작성하기 CMakeLists.txt 파일에 add_custom_command() 명령문을 작성하여, 타겟 빌드 시에 원하는 파일을 삭제할 수 있다. add_custom_command(TARGET ${TARGET} POST_BUILD COMMAND ${CMAKE_COMMAND} -E remove ${DELETE_FILE}) 위 명령문에서 작성자의 의도에 따라 변경될 수 있는 부분은 각각 다음과 같다. ${TARGET} : 빌드 타겟 (예: add_..
개요 본 글에서는 CMake를 이용하여 빌드할 때, 특정 파일을 원하는 디렉토리로 복사하는 방법을 소개한다. 본 글에서 사용된 환경은 다음과 같다. CMake 실행 및 빌드 환경 : 우분투 리눅스 18.04 CMake 버전 : 3.13.2 CMakeLists.txt에 파일 복사 명령문 작성하기 CMakeLists.txt 파일에 add_custom_command() 명령문을 작성하여, 타겟 빌드 시에 원하는 파일을 원하는 디렉토리로 복사할 수 있다. add_custom_command(TARGET ${TARGET} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${FROM} ${TO}) 위 명령문에서 작성자의 의도에 따라 변경될 수 있는 부분은 각각 다음과 같다. ${TARG..
__attribute__((visibility(""))) 매크로를 활용하면 라이브러리 내에 구현된 함수를 라이브러리 외부에서 호출할 수 있을지 여부를 결정할 수 있다. 라이브러리 내 함수를 구현할 때, 아래와 같이 __attribute__((visibility("default"))) 속성을 부여하면 해당 함수가 라이브러리 외부에 노출되어, 해당 함수를 라이브러리 외부에서 호출할 수 있다. 즉, 라이브러리를 링크하는 어플리케이션에서 해당 함수를 호출할 수 있다. void __attribute__((visibility("default"))) do_something() { ... } 반대로, 아래와 같이 __attribute__((visibility("hidden"))) 속성을 부여하면 해당 함수가 라이브러리..
MacOS에서 어떤 파일을 다른 디렉토리로 복사하고자 할 때 다음과 같은 팝업창이 뜨면서 실패하는 경우가 있다. "예기치 않은 오류가 발생했기 때문에 작업을 완료할 수 없습니다(오류 코드 -50)." 구글신에게 여쭤봐도 해결방법이 잘 나오지 않았는데, 이것저것 시도하다보니 파일명이 너무 길어서, 혹은 복사하고자 하는 디렉토리의 경로와 파일명을 합친 절대경로의 길이(예: /Volumes/GoogleDrive-118432738282491717171717/내 드라이브/프로젝트/신규/복사할파일.txt)가 너무 길어서 발생하는 문제인 것을 알았다. 그래서, 파일명을 짧게 수정하여 복사했더니 오류 없이 잘 복사 되었다.
보통 GNSS(GPS) 모듈은 1초에 한번씩 펄스 신호를 출력하는 핀을 가지고 있다. 해당 신호의 출력 시점은 UTC 절대시각과 매우 정밀하게 동기화되어 있기 때문에, 시스템에서는 해당 신호를 이용하여 시간 동기 등의 동작을 보다 정밀하게 수행할 수 있다. 일반적으로, GNSS 모듈을 사용하는 시스템은 GNSS 모듈의 PPS 신호 출력 핀을 프로세서(CPU 등)에 연결하여, PPS 신호 발생 시마다 해당 신호를 프로세서 상에서 동작하는 프로그램에서 사용할 수 있도록 구성한다. 시스템 운영체제가 리눅스일 경우, 리눅스 커널이 PPS 신호를 처리한 후 시스템 콜을 통해 어플리케이션 프로그램이 해당 신호의 발생시점을 받을 수 있도록 하는 Kernel PPS 기능을 제공된다. 따라서 어플리케이션 프로그램에서는 ..
MacOS에 CLion(2020.3.4 버전)을 설치하여 사용하고 있었는데, MacOS를 Big Sur로 업데이트한 후에 CLion에서 CMake를 reload해 보니 다음과 같은 에러가 발생하였다. /Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake -DCMAKE_BUILD_TYPE=Debug -G "CodeBlocks - Unix Makefiles" /Users/gyun/workspace/v2x-sw CMake Warning at /Applications/CLion.app/Contents/bin/cmake/mac/share/cmake-3.17/Modules/Platform/Darwin-Initialize.cmake:286 (message): Ignor..
리눅스에서 어떤 실행 파일을 실행했을 때 "error while loading shared libraries"라는 에러가 출력되면서 실행되지 않는 경우가 있다. 아래 예시는 hello라는 라이브러리(libhello.so)를 링크해서 사용하는 app라는 어플리케이션을 실행했을 때 출력된 에러 메시지이다. $ ./app ./app: error while loading shared libraries: libhello.so: cannot open shared object file: No such file or directory $ 이는 말 그대로 app 어플리케이션을 실행하기 위해 필요한 libhello.so 파일을 찾을 수 없다는 이야기인데, libhello.so 라이브러리 파일을 시스템 라이브러리 디렉토리(..
OpenSSL이 제공하는 기능을 이용하여 다음과 같이 AES-CCM-128 암호화 및 복호화 함수를 만들 수 있습니다. #include #include #include "openssl/evp.h" #define AES_CCM_128_TAG_LEN (16) ///< AES-CCM-128 암호화 Tag 바이트열 길이 #define AES_CCM_128_KEY_LEN (16) ///< AES-CCM-128 키 바이트열 길이 #define AES_CCM_128_NONCE_LEN (12) ///< AES-CCM-128 Nonce 바이트열 길이 /** * @brief AES-CCM-128 암호화를 수행한다. * @param[in] plaintext 암호화할 평문 (Null 전달 시 EVP_EncryptUpdate(..
본 글에서는 윈도우 방식의 줄 구분자(\r\n)가 포함된 텍스트 파일을 리눅스 방식의 줄 구분자(\n)로 변환해 주는 방법에 대해 설명합니다. 줄 구분자 (Line separator) 우리가 사용하는 텍스트 파일 내 각 줄의 끝에는 줄 구분자(Line separator)가 포함되어 있습니다. 편집기 프로그램들은 텍스트 파일을 열 때, 줄 구분자가 있는 부분에서 개행(줄바꿈)을 하여 화면에 표시합니다. 예를 들어 다음과 같이 두 줄이 포함된 텍스트 파일이 있다고 가정해 보겠습니다. 안녕하세요 오늘도야근 블로그입니다. 반갑습니다. 위 텍스트 파일은 실제로는 다음과 같이 저장되어 있습니다. (리눅스와 macOS 등 유닉스 계열의 운영체제에서는 줄 구분자로 "\n"을 사용합니다) 안녕하세요 오늘도야근 블로그입니..
CLion은 편집기 상에서 새로운 파일을 생성하거나 편집기에 열려 있는 파일을 업데이트 저장할 때, 저장되는 파일의 저장 형식을 지정할 수 있습니다. 정확하게는 Line separator라고 불리는 줄 구분자의 형식을 정해 줄 수 있습니다. 줄 구분자(Line separator)란? 텍스트 파일의 경우, 각 줄이 끝났음을(즉, 줄이 바뀌는 것을) 표시하기 위해 각 줄의 마지막에 줄 구분자(Line separator)라고 불리는 특수문자가 추가로 저장됩니다. 이러한 줄 구분자는 공통으로 약속된 형식을 사용하게끔 되어 있어, 해당 텍스트 파일을 사용하는 시스템(장치)의 종류나 특성에 무관하게 동일하게 해석되어 사용될 수 있습니다. 다만, 우리가 주로 사용하는 양대 운영체제 별로 서로 다르게 사용하고 있어 이..
CLion은 함수의 각 인자들에 대한 힌트를 제공하는 기능을 지원합니다. 다음 화면을 보면 calloc() 함수의 첫번째 인자와 두번째 인자로 어떤 값이 입력되어야 하는지에 대한 힌트를 제공하는 것을 알 수 있습니다. 이는 편리한 기능이기는 하지만, 개인적으로는 출력된 힌트로 인해 코드 라인이 실제로 차지하는 길이와 보이는 길이가 달라 불편함을 느낍니다. 이에 힌트 기능을 꺼 보도록 하겠습니다. 본 글에서 사용된 CLion 버전은 MacOS용 2020.3.3 버전입니다. "CLion" → "Prefrences" 메뉴를 선택하여 설정 창을 띄운 후, 좌측 선택 창에서 "Editor" → "Inlay Hints" → "C/C++" 항목을 선택합니다. 아래 화면과 같이 "Show parameter hints"..