I'm trying to add a new DLL search path. I don't have any problems with 'SetDllDirectory' but I cannot use it as the directory is not permanent; a subsequent call will remove it. The function 'SetDefaultDllDirectories' offers many configuration flags, the ones I care about are:
LOAD_LIBRARY_SEARCH_DEFAULT_DIRS LOAD_LIBRARY_SEARCH_SYSTEM32 LOAD_LIBRARY_SEARCH_APPLICATION_DIR LOAD_LIBRARY_SEARCH_USER_DIRS LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR If DLL_LOAD_DIR is set then cygwin DLL lookups work as usual but any directories added with 'AddDllDirectory' are ignored. If DLL_LOAD_DIR is not set, then cygwin DLLs cannot be found. To use SEARCH_USER_DIRS I must omit DLL_LOAD_DIR as well as reimplement cygwin DLL lookup by adding every directory (recursively) beneath "/usr/lib" and "/usr/bin" (using 'AddDllDirectory') as well as the directory I initially wanted to add. Which at 1687 directories is not ideal. I am testing with "_umath_linalg.cpython-38-x86_64-cygwin.dll" (from numpy) and "vtkCommonCore.cpython-38-x86_64-cygwin.dll" from VTK, both copied to a test directory. The missing VTK libraries exist in the directory I wish to add. They are python modules and the module loading process is not compatible with 'SetDllDirectory'. $ ldd _umath_linalg.cpython-38-x86_64-cygwin.dll ... cygblas-0.dll => /usr/bin/cygblas-0.dll (0x3da3a0000) cyglapack-0.dll => /usr/lib/lapack/cyglapack-0.dll (0x3b8040000) ... $ ldd vtkCommonCore.cpython-38-x86_64-cygwin.dll ... vtkCommonCore.cpython-38-x86_64-cygwin.dll => /.../test/vtkCommonCore.cpython-38-x86_64-cygwin.dll (0x522a10000) cygvtkCommonCore.dll => not found cygvtkWrappingPythonCore3.8.dll => not found cygvtksys.dll => not found ... This is my test program: #include <stdlib.h> #include <stdio.h> #include <dlfcn.h> #include <Windows.h> #include <libloaderapi.h> int main(int argc, char** argv) { //SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR); //SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR | LOAD_LIBRARY_SEARCH_DEFAULT_DIRS); //SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_DEFAULT_DIRS); //SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | LOAD_LIBRARY_SEARCH_USER_DIRS); SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR); //SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_USER_DIRS); //SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_USER_DIRS | LOAD_LIBRARY_SEARCH_SYSTEM32); //SetDefaultDllDirectories(LOAD_WITH_ALTERED_SEARCH_PATH); // Cygwin paths do not work //AddDllDirectory(L"/bin"); //AddDllDirectory(L"/lib"); //AddDllDirectory(L"/usr/bin"); //AddDllDirectory(L"/usr/lib"); //AddDllDirectory(L"/usr/lib/lapack"); //AddDllDirectory(L"/cygdrive/c/WINDOWS"); //AddDllDirectory(L"/cygdrive/c/WINDOWS/SYSTEM32"); //AddDllDirectory(L"/cygdrive/c/Users/.../test"); //AddDllDirectory(L"/cygdrive/c/Users/.../pyvenv38/lib/python3.8/site-packages/vtkmodules"); AddDllDirectory(L"C:\\cygwin64\\bin"); AddDllDirectory(L"C:\\cygwin64\\lib"); //AddDllDirectory(L"C:\\cygwin64\\lib\\lapack"); //AddDllDirectory(L"C:\\Windows"); //AddDllDirectory(L"C:\\Windows\\System32"); //AddDllDirectory(L"C:\\Users\\...\\test"); AddDllDirectory(L"C:\\Users\\...\\pyvenv38\\lib\\python3.8\\site-packages\\vtkmodules"); //SetDllDirectoryW(L"C:\\Users\\...\\pyvenv38\\lib\\python3.8\\site-packages\\vtkmodules"); if (argc != 2) { printf("Error: one argument accepted: filepath to a DLL\n"); return 2; } if (!argv[1][0]) { printf("Error: Path must not be empty\n"); return 2; } printf("Testing dlopen with '%s'\n", argv[1]); void* sh = LoadLibraryA(argv[1]); //void* sh = LoadLibraryEx(argv[1], NULL, 0x0); //void* sh = dlopen(argv[1], RTLD_NOW); if (!sh) { char* dle = dlerror(); printf("Symbol table handle was null: %s\n", dle); return 1; } else { printf("Succeeded: not null\n"); return 0; } } Please advise. Thanks, -- Problem reports: https://cygwin.com/problems.html FAQ: https://cygwin.com/faq/ Documentation: https://cygwin.com/docs.html Unsubscribe info: https://cygwin.com/ml/#unsubscribe-simple