diff --git a/gpt4all-backend/dlhandle.cpp b/gpt4all-backend/dlhandle.cpp index f4b99860..fd9a1f22 100644 --- a/gpt4all-backend/dlhandle.cpp +++ b/gpt4all-backend/dlhandle.cpp @@ -1,8 +1,11 @@ #include "dlhandle.h" +#include + #ifndef _WIN32 # include #else +# include # include # define WIN32_LEAN_AND_MEAN # ifndef NOMINMAX @@ -11,6 +14,7 @@ # include #endif +using namespace std::string_literals; namespace fs = std::filesystem; @@ -19,7 +23,7 @@ namespace fs = std::filesystem; Dlhandle::Dlhandle(const fs::path &fpath) { chandle = dlopen(fpath.c_str(), RTLD_LAZY | RTLD_LOCAL); if (!chandle) { - throw Exception("dlopen(\"" + fpath.filename().string() + "\"): " + dlerror()); + throw Exception("dlopen: "s + dlerror()); } } @@ -34,13 +38,22 @@ void *Dlhandle::get_internal(const char *symbol) const { #else // defined(_WIN32) Dlhandle::Dlhandle(const fs::path &fpath) { - auto afpath = fs::absolute(fpath); + fs::path afpath = fs::absolute(fpath); + + // Suppress the "Entry Point Not Found" dialog, caused by outdated nvcuda.dll from the GPU driver + UINT lastErrorMode = GetErrorMode(); + UINT success = SetErrorMode(lastErrorMode | SEM_FAILCRITICALERRORS); + assert(success); + chandle = LoadLibraryExW(afpath.c_str(), NULL, LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR); + success = SetErrorMode(lastErrorMode); + assert(success); + if (!chandle) { - auto err = GetLastError(); + DWORD err = GetLastError(); std::ostringstream ss; - ss << "LoadLibraryExW(\"" << fpath.filename().string() << "\") failed with error 0x" << std::hex << err; + ss << "LoadLibraryExW failed with error 0x" << std::hex << err; throw Exception(ss.str()); } } diff --git a/gpt4all-backend/llmodel.cpp b/gpt4all-backend/llmodel.cpp index 3a340c81..afcb79e3 100644 --- a/gpt4all-backend/llmodel.cpp +++ b/gpt4all-backend/llmodel.cpp @@ -141,12 +141,18 @@ const std::vector &LLModel::Implementation::implementat if (!std::regex_search(p.stem().string(), re)) continue; // Add to list if model implementation + Dlhandle dl; try { - Dlhandle dl(p); - if (!isImplementation(dl)) - continue; - fres.emplace_back(Implementation(std::move(dl))); - } catch (...) {} + dl = Dlhandle(p); + } catch (const Dlhandle::Exception &e) { + std::cerr << "Failed to load " << p.filename().string() << ": " << e.what() << "\n"; + continue; + } + if (!isImplementation(dl)) { + std::cerr << "Not an implementation: " << p.filename().string() << "\n"; + continue; + } + fres.emplace_back(Implementation(std::move(dl))); } } };