diff --git a/CMakeLists.txt b/CMakeLists.txt index 9314923..20960c2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,12 @@ if (MSVC) add_compile_options(/source-charset:utf-8) endif() +if (CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND CMAKE_SYSTEM_NAME MATCHES "Windows") + MESSAGE(STATUS "Ofen Add MinGW Param.") + add_compile_options(-finput-charset=utf-8) + add_compile_options(-fexec-charset=gbk) +endif() + set(CMAKE_DEBUG_POSTFIX "d") message(STATUS "System: ${CMAKE_SYSTEM_NAME}") message(STATUS "Compiler CXX ID: ${CMAKE_CXX_COMPILER_ID}") @@ -30,7 +36,6 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin/${CMAKE_BUILD_TYPE} add_library(Ofen STATIC ${SRC_FILES}) target_include_directories(Ofen PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) - # **************************************************************************************** install(DIRECTORY ${CMAKE_SOURCE_DIR}/include/ DESTINATION ${CMAKE_INSTALL_PREFIX}/include) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/OfenConfig.cmake DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/cmake/Ofen) diff --git a/src/of_path.cpp b/src/of_path.cpp index 9ad65b4..27207f4 100644 --- a/src/of_path.cpp +++ b/src/of_path.cpp @@ -73,6 +73,16 @@ ofString COfPath::get_home() #if defined(_WIN32) ofChar* value = nullptr; std::size_t len = 0; + // _dupenv_s() 在 Visual Studio 2008 的 CRT (msvcr90) 中引入的,似乎没有进入系统 CRT (msvcrt)。 + // mingw-w64 GCC 通常默认只链接到系统 CRT,所以所以找不到这个符号。 + +#if defined(__MINGW32__) || defined(__MINGW64__) + ofChar* homedir = getenv("USERPROFILE"); + if (homedir) { + return ofString(homedir); + } + return ofT(""); +#else #ifdef UNICODE_OFSTR auto err = _wdupenv_s(&value, &len, ofT("USERPROFILE")); #else @@ -85,6 +95,7 @@ ofString COfPath::get_home() } else { return ofT(""); } +#endif #else ofChar* homedir = getenv("HOME"); if (homedir) { diff --git a/src/of_util.cpp b/src/of_util.cpp index 055bac2..e355241 100644 --- a/src/of_util.cpp +++ b/src/of_util.cpp @@ -32,7 +32,11 @@ void CMutBuffer::remove_of(int start_pos, int len) return; } #ifdef _WIN32 +#if defined(__MINGW32__) || defined(__MINGW64__) + auto end_pos = std::min(start_pos + len, static_cast(buffer_.size())); +#else auto end_pos = min(start_pos + len, static_cast(buffer_.size())); +#endif #else auto end_pos = std::min(start_pos + len, static_cast(buffer_.size())); #endif