1 /************************************************************************** 2 * 3 * Copyright 2012 Jose Fonseca 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a copy 7 * of this software and associated documentation files (the "Software"), to deal 8 * in the Software without restriction, including without limitation the rights 9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 * copies of the Software, and to permit persons to whom the Software is 11 * furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in 14 * all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 * THE SOFTWARE. 23 * 24 **************************************************************************/ 25 26 /* 27 * Dynamic library linking abstraction. 28 */ 29 30 #pragma once 31 32 33 #if defined(_WIN32) 34 #include <windows.h> 35 #else 36 #include <dlfcn.h> 37 #endif 38 39 40 #if defined(_WIN32) 41 #define OS_LIBRARY_EXTENSION ".dll" 42 #elif defined(__APPLE__) 43 #define OS_LIBRARY_EXTENSION ".dylib" 44 #else 45 #define OS_LIBRARY_EXTENSION ".so" 46 #endif 47 48 49 namespace os { 50 51 // TODO: Wrap in a class 52 #if defined(_WIN32) 53 typedef HMODULE Library; 54 #else 55 typedef void * Library; 56 #endif 57 58 inline Library openLibrary(const char * filename)59 openLibrary(const char *filename) { 60 #if defined(_WIN32) 61 return LoadLibraryA(filename); 62 #else 63 return dlopen(filename, RTLD_LOCAL | RTLD_LAZY); 64 #endif 65 } 66 67 inline void * getLibrarySymbol(Library library,const char * symbol)68 getLibrarySymbol(Library library, const char *symbol) { 69 #if defined(_WIN32) 70 return (void *)GetProcAddress(library, symbol); 71 #else 72 return dlsym(library, symbol); 73 #endif 74 } 75 76 inline void closeLibrary(Library library)77 closeLibrary(Library library) { 78 #if defined(_WIN32) 79 FreeLibrary(library); 80 #else 81 dlclose(library); 82 #endif 83 } 84 85 86 } /* namespace os */ 87 88