본문 바로가기

운동하는 개발자/c++

(19)
C++ 윈도우 환경변수 값 획득 (Get Windows Environment Variable Values) C++에서 ofstream 사용 시 path에 윈도우 환경변수(예시 : %appdata%)가 있으면 파일 생성이 되지 않았기에 해당 값을 획득 후 생성해야 했다 std::string 내에 환경변수가 섞여있는 경우의 예제가 없어서 직접 만들었다 std::string ReplaceEnvVar(const std::string& str) { std::string result = str; //문자열에서 환경변수 위치 찾음 std::size_t pos = result.find('%'); while (pos != std::string::npos) { std::size_t endpos = result.find('%', pos + 1); if (endpos != std::string::npos) { std::string..
c++ UTF8 to Euc-kr (UTF8 json 한글 데이터 std::string에 저장하기 + ofstream error) feat boost::locale 웹에서 http통신으로 json 한글이 섞인 데이터를 수신하였는데 UTF-8 타입이였다 이 UTF-8을 그대로 std::string에 넣어서 디렉토리 생성 함수는 정상적으로 동작하였으나 ofstream을 사용하여 파일 open시 에러가 발생하였다.. 디버깅해보니 한글이 들어간 문자열이 디버깅 환경에서 보이지 않았고 라는 문구를 보여주었다 물론 바이트별로 데이터를 볼 수 있었지만 한글은 ?? 로 표시되었으며 한 글자당 3바이트로 표현되고있었다 원인을 찾아보니 내 visual studio 2022환경에서는 디폴트로 코드페이지에 의해 EUC-KR이 기본이 되는거 같았다 코트페이지를 변경하거나 뭔가 다른방법이 있겠으나... 코드를 공유하는 같은 팀원들도 같은 이슈를 발생할 수 있다고 생각되서 UTF8을 EUC-..
Visual studio c++ fatal error C1128: 섹션 수가 개체 파일 형식 한도를 초과했습니다. /bigobj를 사용하여 컴파일하십시오. boost::asio를 사용하여 https 통신을 개발하고 있었는데 다음과 같은 에러가 발생했다 fatal error C1128: 섹션 수가 개체 파일 형식 한도를 초과했습니다. /bigobj를 사용하여 컴파일하십시오. 해결책은 단순히 /bingobj 옵션만 추가해서 컴파일 하면 되는 것인데 원인이 궁금했다 우선 바쁘신분들을 위한 해결책 프로젝트 속성 -> 구성 속성 -> C/C++ -> 명령줄 여기서 추가 옵션에 /bigobj를 넣으면 끝! 이어서 찾아본 원인을 얘기해 보자면 우선 공식 MS에 답변이다 출처 : https://learn.microsoft.com/ko-kr/cpp/build/reference/bigobj-increase-number-of-sections-in-dot-obj-file?vie..
c++ boost를 이용한 json 파싱 (boost::json & boost::property_tree) boost library를 사용하여 json 데이터를 파싱 하는 법을 찾아보니 두 가지 라이브러리가 있었다 둘 다 해더만 추가해서 간단하게 사용하는 방식이였고 자료는 property_tree 이게 압도적으로 많았고 boost::json은 잘 안 쓰이는지 예제 코드가 많이 없었다 특히 array내부의 값을 획득하는 예제를 찾는데 힘들었다 왜 동일한 기능의 라이브러리가 두가지로 나눠져 있나 궁금하여 찾아보았다 boost::property_tree가 먼저 나왔으며 이는 트리구조로 JSON뿐만 아니라 XML, INI를 읽을 수 있다 정확히는 JSON을 파싱 하는 용도라기보단 트리구조로 다양한 형식의 데이터를 처리하기 위한 라이브러리이다 다음 boost:json의 경우에는 목적 자체가 JSON데이터를 처리하기 위..
DLL 명시적 링크 LoadLibrary failed 지정된 모듈을 찾을 수 없습니다 (GetLastError : error code 126) c++을 이용해서 명시적링크로 DLL파일을 LoadLibrary 로 읽어오는 작업을 했다 HINSTANCE hDLL; // Handle to DLL hDLL = LoadLibrary("MyDLL"); 핸들 인스턴스를 만들고 LoadLibaray를 호출 할 때 다른 폴더에 있는 DLL파일의 절대경로를 읽어와서 파라미터로 넣어주었는데 핸들은 계속 nullptr이였고 DWORD error_code; error_code = GetLastError();​ 위와 같이 GetLastError 를 호출 해 봤더니 126의 에러코드를 발생하고있었다 126은 모듈을 찾을 수 없다는 내용인데 해당 DLL파일의 절대경로는 윈도우 탐색기로부터 파일을 선택해서 넣은 값인데 이게 잘못될 수 없는데...? 다른 DLL을 읽어보니 정..
c++ wstring to string / string to wstring 몇몇 오래된 API를 쓰다보면 유니코드 문자 타입을 써야 할일이 종종 있다 타입변환 방법은 여러가지가 있지만 최신 C++스럽게 변환해보자(작성당시 c++17버전 사용 + winapi사용안함) - wstring to string (LPCWSTR to LPCSTR) - string to wstring (LPCSTR to LPCWSTR ) #include std::string WstrToStr(const std::wstring& source) { return std::string().assign(source.begin(), source.end()); } std::wstring StrToWstr(const std::string& source) { return std::wstring().assign(source...
fatal error LNK2019 getfileversioninfoa /GetFileVersionInfoSizeA 확인할 수 없는 외부 참조 윈도우 파일 버전 획득 기능을 c++로 구현하면서 winapi를 사용하였는데 빌드 중 위와 같은 에러들이 발생했다 #include 를 추가하였고 해당 함수들을 추적해보면 해당 해더 안에 있는 것도 확인되는데 왜 빌드 중에 fatal error LNK2019에러가 발생하는가 계속 윈도우 파일 버전 획득 방법들을 검색해보다 알게 되었는데 #pragma comment(lib,"version.lib") 이렇게 lib를 추가해줘야 하고 해더만 추가하는 방식은 MFC라이브러리에서만 되는 것으로 추정되었다 MFC를 사용하고 있지 않다면 위와 같이 추가해주면 빌드 중 에러가 발생하지 않는다
error C2143: 구문 오류: ';'이(가) 'namespace' 앞에 없습니다. 이 에러는 해더가 여러 번 호출될 때 발생하기도 한다고 한다 그땐 #prgram once 를 맨 위에 넣어서 중복 호출을 막아주자 나의 경우엔 해더 중복호출 문제가 아니었고 클래스에 코드를 추가하다 발생했다 해당 에러 내용을 visual studio에서 더블클릭해서 따라가 봤다 네..? list??? 실수로 세미콜론을 지우고 저장했나...? 의심했는데 해당 라인엔 아무 문제없었다 진짜 원인은 저 list를 include 한 cpp 파일 중 하나에 세미콜론이 빠졌던 것이다 그것도 list 선언이 아닌 부분에서...;; 너무 불친절한 에러 설명 엄한 데만 계속 찾아보게 되었다 참으로 친해지기 힘든 c++...