精华内容
下载资源
问答
  • windows动态库加载目录顺序
    2020-10-12 10:56:42

    在读TNN/MACE代码时总看到动态加载相关代码,因此在这做一个总结和试用。代码参考windows动态加载linux动态加载

    通过dlsym/getprocaddress获取动态库的函数地址,然后利用该地址进行其它相关操作(重命名函数之类的)。

    #ifdef WIN32
    #include <windows.h>
    #else
    #include <dlfcn.h>
    #endif
    #include <stdio.h>
    #include <stdlib.h>
    #include "CL/cl.h"
    
    typedef CL_API_ENTRY cl_int(CL_API_CALL *clGetPlatformIDsFuncPtr)(
    	cl_uint          /* num_entries */,
    	cl_platform_id * /* platforms */,
    	cl_uint *        /* num_platforms */) CL_API_SUFFIX__VERSION_1_0;
    typedef CL_API_ENTRY cl_int(CL_API_CALL *clGetPlatformInfoFuncPtr)(
    	cl_platform_id   /* platform */,
    	cl_platform_info /* param_name */,
    	size_t           /* param_value_size */,
    	void *           /* param_value */,
    	size_t *         /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
    static clGetPlatformIDsFuncPtr clGetPlatformIDsPtr = NULL;
    static clGetPlatformInfoFuncPtr clGetPlatformInfoPtr = NULL;
    
    #define clGetPlatformInfo clGetPlatformInfo_Test
    cl_int CL_API_CALL clGetPlatformInfo_Test(
    	cl_platform_id   platform,
    	cl_platform_info param_name,
    	size_t           param_value_size,
    	void             *param_value,
    	size_t           *param_value_size_ret)
    {
    	return (clGetPlatformInfoPtr)(platform, param_name, param_value_size, param_value, param_value_size_ret);
    }
    int main()
    {
    #ifdef WIN32
    	HINSTANCE ocl_lib = LoadLibrary(TEXT("opencl.dll"));
    	if (!ocl_lib)
    	{
    		printf("Load Library failed\n");
    	}
    	clGetPlatformIDsPtr = (clGetPlatformIDsFuncPtr)(GetProcAddress(ocl_lib, "clGetPlatformIDs"));
    	clGetPlatformInfoPtr = (clGetPlatformInfoFuncPtr)(GetProcAddress(ocl_lib, "clGetPlatformInfo"));
    #else
    	void* ocl_lib = dlopen("libOpenCL.so", RTLD_NOW);
    	if (!ocl_lib)
    	{
    		printf("Load Library failed\n");
    	}
    	clGetPlatformIDsPtr = (clGetPlatformIDsFuncPtr)(dlsym(ocl_lib, "clGetPlatformIDs"));
    	clGetPlatformInfoPtr = (clGetPlatformInfoFuncPtr)(dlsym(ocl_lib, "clGetPlatformInfo"));
    #endif
    
    	unsigned int num = 0;
    	int iRslt = clGetPlatformIDsPtr(0, NULL, &num);
    
    	cl_platform_id* platform_id = (cl_platform_id*)malloc(num * sizeof(cl_platform_id));
    
    	iRslt = clGetPlatformIDsPtr(num, platform_id, NULL);
    
    	cl_platform_id cl_platform = platform_id[0];
    	free(platform_id);
    	char platname[50];
    	clGetPlatformInfo(cl_platform, CL_PLATFORM_NAME, 50 * sizeof(char),
    		platname, NULL);
    #ifdef WIN32
    	FreeLibrary(ocl_lib);
    #else
    	dlclose(ocl_lib);
    #endif
    	printf("%s\n", platname);
    	return iRslt;
    }

     

    更多相关内容
  • 之所以想搞明白这个是因为之前写的qt...首先,你的exe文件在编译的时候指定了它需要哪些部分的dll文件,在应用程序加载dll的时候如果加载错(同名)了dll就会报错 接下来的内容是 1. 参考MSDN,给出Windows下DLL查.

    之所以想搞明白这个是因为之前写的qt项目release版本和debug版本执行效果不一样

    所以想弄明白

    主要参考了这个博客,感觉说的比较明白,然后下面是我读自己想要的部分进行提取的

    https://www.cnblogs.com/tocy/p/windows_dll_searth_path.html

     

    首先,你的exe文件在编译的时候指定了它需要哪些部分的dll文件,在应用程序加载dll的时候如果加载错(同名)了dll就会报错

    接下来的内容是

    1. 参考MSDN,给出Windows下DLL查找顺序

    2. 简单使用ProcessMonitor来验证DLL查找顺序

     

    1

    应用程序可以通过以下方式控制一个DLL的加载路径:

    • 使用全路径加载、
    • 使用DLL重定向
    • 使用manifest文件。

     

     

     

    如果上述三种方式均未指定,系统查找DLL的顺序将按照本部分描述的顺序进行

    对于以下两种情况的DLL,系统将不会查找,而是直接加载:

    对于已经加载到内存中的同名DLL,系统使用已经加载的DLL,并且忽略待加载DLL的路径。(注意对某个进程而言,系统已经加载的DLL一定是唯一的存在于某个目录下。)

    b. 如果该DLL存在于某个Windows版本的已知DLL列表(unkown DLL)中,系统使用已知DLL的拷贝(包括已知DLL的依赖项)。已知DLL列表可以从如下注册表项看到:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs。

    这里有个比较坑的地方,对于有依赖项的DLL(即使使用全路径指定DLL位置),系统查找其所依赖DLL的方法是按照实际的模块名称来的,因此如果加载的DLL不在系统查找顺序目录下,那么动态加载该DLL(LoadLibrary)会返回一个"找不到模块"的错误。

     

     

     

    2. 系统标准DLL查找顺序

    系统使用的标准DLL查找顺序依赖于是否设置了"安全DLL查找模式"(safe DLL search mode)。"安全DLL查找模式"会将用户当前目录置于查找顺序的后边。

    "安全DLL查找模式"默认是启用的,禁用的话,可以将注册表项HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode设为0。调用SetDllDirectory函数可以禁用"安全DLL查找模式",并修改DLL查找顺序。

    Windows XP下,"安全DLL查找模式"默认是禁用的,需要启用该项的话,在注册表中新建一个SafeDllSearchMode子项,并赋值为1即可。"安全DLL查找模式"从Windows XP SP2开始,默认是启用的。

     

    启用"安全DLL查找模式"时,查找顺序如下:

    a. 应用程序所在目录;

    b. 系统目录。GetSystemDirectory返回的目录,通常是系统盘\Windows\System32;

    c. 16位系统目录。该项只是为了向前兼容的处理,可以不考虑;

    d. Windows目录。GetWindowsDirectory返回的目录,通常是系统盘\Windows;

    e. 当前目录。GetCurrentDirectory返回的目录;

    f. 环境变量PATH中所有目录。

     

     

    如果"安全DLL查找模式"被禁用,查找顺序如下:

    a. 应用程序所在目录;

    b. 当前目录。GetCurrentDirectory返回的目录;

    c. 系统目录。GetSystemDirectory返回的目录,通常是系统盘\Windows\System32;

    d. 16位系统目录。该项只是为了向前兼容的处理,可以不考虑;

    e. Windows目录。GetWindowsDirectory返回的目录,通常是系统盘\Windows;

    f. 环境变量PATH中所有目录。

     

     

    默认情况下应该是这个:

    包含可执行文件的目录。

    Windows 的系统目录,该目录可以通过 GetSystemDirectory 得到,一般为 System32 目录,若为 32 位程序跑在 64 位系统下,则为 SysWOW64 目录。

    16 位的系统目录,即 Windows 目录中的 System 目录。 Windows 目录,该目录可以通过 GetWindowsDirectory 得到。 进程的当前目录。

    PATH 环境变量中所列出的目录。

     

     

     

     

     

    展开全文
  • dll文件的加载路径顺序
  • Windows/Linux链接器加载动态库的搜索路径顺序

    Windows/Linux链接器加载动态库的搜索路径顺序


    如需转载请标明出处:http://blog.csdn.net/itas109
    QQ技术交流群:129518033

    目录

    系统:Ubuntu 16.04.5 64bit
    系统:windows 7 64bit


    前言

    Windows/Linux程序运行时,其动态库的路径搜索是有顺序的。本文介绍其搜索顺序。

    1.Windows链接器加载动态库的搜索路径顺序

    通过隐式和显式链接,Windows首先搜索“已知DLL”,例如Kernel32.dll和User32.dll。 Windows然后按以下顺序搜索DLL:

    1. 当前进程的可执行模块所在的目录
    2. 当前目录
    3. Windows系统目录。如C:\Windows\System32,GetSystemDirectory函数检索此目录的路径
    4. Windows目录。 如C:\Windows,GetWindowsDirectory函数检索此目录的路径
    5. PATH环境变量中列出的目录

    英文原文:

    Windows then searches for the DLLs in the following sequence:
    1. The directory where the executable module for the current process is located.
    2. The current directory.
    3. The Windows system directory. The GetSystemDirectory function retrieves the path of this directory.
    4. The Windows directory. The GetWindowsDirectory function retrieves the path of this directory.
    5. The directories listed in the PATH environment variable.
    

    2.Linux链接器加载动态库的搜索路径顺序

    链接器使用以下搜索路径来查找所需的共享库:

    1. -rpath-link选项指定的任何目录。

    2. -rpath选项指定的任何目录。-rpath和-rpath-link之间的区别在于-rpath选项指定的目录包含在可执行文件中并在运行时使用,而-rpath-link选项仅在链接时有效。

    gcc main.c -rpath dir_path
    
    1. 在ELF系统上,对于本机链接器,如果是-rpath和-rpath-link选项未使用,搜索环境变量“LD_RUN_PATH”的内容。 在SunOS上,如果未使用-rpath选项,搜索指定的任何目录使用-L选项。

    2. 对于本机链接器,搜索环境变量的内容“LD_LIBRARY_PATH”。

    3. 对于本机ELF链接器,共享的“DT_RUNPATH”或“DT_RPATH”中的目录在库中搜索它所需的共享库。 “DT_RPATH”条目是如果存在“DT_RUNPATH”条目,则忽略。

    4. 默认目录,通常是/lib和/usr/lib。

    5. 对于ELF系统上的本机链接器,如果文件/etc/ld.so.conf存在,则列表在该文件中找到的目录。

    如果找不到所需的共享库,链接器将发出警告并且继续链接。

    英文原文:

    ld - The GNU linker
    
    -rpath-link=dir
               When using ELF or SunOS, one shared library may require another.  This happens when an
               "ld -shared" link includes a shared library as one of the input files.
    
               When the linker encounters such a dependency when doing a non-shared, non-relocatable
               link, it will automatically try to locate the required shared library and include it
               in the link, if it is not included explicitly.  In such a case, the -rpath-link option
               specifies the first set of directories to search.  The -rpath-link option may specify
               a sequence of directory names either by specifying a list of names separated by
               colons, or by appearing multiple times.
    
               This option should be used with caution as it overrides the search path that may have
               been hard compiled into a shared library. In such a case it is possible to use
               unintentionally a different search path than the runtime linker would do.
    
               The linker uses the following search paths to locate required shared libraries:
    
               1.  Any directories specified by -rpath-link options.
    
               2.  Any directories specified by -rpath options.  The difference between -rpath and
                   -rpath-link is that directories specified by -rpath options are included in the
                   executable and used at runtime, whereas the -rpath-link option is only effective
                   at link time. Searching -rpath in this way is only supported by native linkers and
                   cross linkers which have been configured with the --with-sysroot option.
    
               3.  On an ELF system, for native linkers, if the -rpath and -rpath-link options were
                   not used, search the contents of the environment variable "LD_RUN_PATH".
    
               4.  On SunOS, if the -rpath option was not used, search any directories specified
                   using -L options.
    
               5.  For a native linker, search the contents of the environment variable
                   "LD_LIBRARY_PATH".
    
               6.  For a native ELF linker, the directories in "DT_RUNPATH" or "DT_RPATH" of a shared
                   library are searched for shared libraries needed by it. The "DT_RPATH" entries are
                   ignored if "DT_RUNPATH" entries exist.
    
               7.  The default directories, normally /lib and /usr/lib.
    
               8.  For a native linker on an ELF system, if the file /etc/ld.so.conf exists, the list
                   of directories found in that file.
    
               If the required shared library is not found, the linker will issue a warning and
               continue with the link.
    

    Refrence:

    1. Search Path Used by Windows to Locate a DLL
    2. ld on ubuntu
    3. Using ld The GNU linker

    觉得文章对你有帮助,可以扫描二维码捐赠给博主,谢谢!
    在这里插入图片描述
    如需转载请标明出处:http://blog.csdn.net/itas109
    QQ技术交流群:129518033

    展开全文
  • 本文介绍了Windows平台加载动态链接时DLL的标准搜索顺序,以及如果控制搜索顺序

    DLL搜索机制

    Windows桌面应用程序可以通过多种方法来控制DLL加载路径:

    1. 通过manifest文件指定。
    2. DLL重定向技术可以使LoadLibrary 优先在应用程序所在目录查找。
    3. 如果上面两种方法都没有使用,则会做下面的检查:
      - 如果同名的DLL已经在内存里,则会直接使用,不会开启搜索。
      - 如果DLL在知名的DLL列表里(在这个注册表下: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs),则会使用这些知名DLL,不会开启搜索。
    4. 如果以上条件都没有满足,则会开启DLL搜索。
    5. 另外,对于DLL依赖的其他DLL,比如a.dll依赖b.dll,系统会直接用b.dll的名字调用LoadLibrary,而不会加入额外的路径。

    DLL标准搜索顺序

    DLL标准搜索顺序,分安全搜索模式和非安全搜索模式。默认安全搜索模式是开启的,如果要禁用可以通过创建注册表键值HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager**SafeDllSearchMode**并设为0。本文只讨论安全搜索模式。对于非安全搜索模式,可以参考官方文档

    安全模式搜索顺序:

    1. 应用程序加载时所在的目录。

    2. 系统目录。可以使用GetSystemDirectory获取。

       #include <Windows.h>
       #include <iostream>
       int main() {
           const int MAX_BUFFER_SIZE = 1024;
           wchar_t buffer[MAX_BUFFER_SIZE];
           UINT len = GetSystemDirectoryW(buffer, MAX_BUFFER_SIZE);
           if (!len) {
               std::wcout << "GetSystemDirectory failed with error code: " << GetLastError() << std::endl;
           }
           else
           {
               std::wcout << buffer << std::endl;
           }
           return 0;
       }
    

    输出:
    C:\WINDOWS\system32

    1. 16位系统目录。

    2. Windows目录。使用GetWindowsDirectory获取。

      #include <Windows.h>
      #include <iostream>
      int main() {
          const int MAX_BUFFER_SIZE = MAX_PATH;
          wchar_t buffer[MAX_BUFFER_SIZE];
          UINT len = GetWindowsDirectoryW(buffer, MAX_BUFFER_SIZE);
          if (!len) {
              std::wcout << "GetWindowsDirectory failed with error code: " << GetLastError() << std::endl;
          }
          else
          {
              std::wcout << buffer << std::endl;
          }
          return 0;
      }
    

    输出:

    C:\WINDOWS

    1. 当前目录。使用GetCurrentDirectory获取。
      int main() {
          const int MAX_BUFFER_SIZE = MAX_PATH;
          wchar_t buffer[MAX_BUFFER_SIZE];
          DWORD len = GetCurrentDirectoryW(MAX_BUFFER_SIZE, buffer);
          if (!len) {
              std::wcout << "GetCurrentDirectory failed with error code: " << GetLastError() << std::endl;
          }
          else
          {
              std::wcout << buffer << std::endl;
          }
          return 0;
      }
    

    这个函数的输出可能和应用程序所在的路径不同。

    1. 系统环境变量PATH下的目录。

    DLL候补搜索顺序

    当使用LoadLibraryEx函数,并且指定LOAD_WITH_ALTERED_SEARCH_PATH标记,以及 lpFileName参数是绝对路径时,会触发DLL候补搜索顺序。候补搜索顺序和标准搜索顺序的区别只在第一条。

    安全模式下DLL候补搜索顺序:

    1. 参数lpFileName所在的目录。
    2. 系统目录。
    3. 16位系统目录。
    4. Windows目录。
    5. 当前目录。
    6. 系统环境变量PATH下的目录。

    通过调用SetDllDirectory函数也可以改变候补搜索顺序:

    1. 应用程序加载的目录。
    2. 通过SetDllDirectory添加的目录。
    3. 系统目录。
    4. 16位系统目录。
    5. Windows目录。
    6. 系统环境变量PATH下的目录。

    自定义搜索顺序

    应用程序可以通过指定LoadLibraryExSetDefaultDllDirectories函数中不同的搜索标记来自定义搜索顺序。下面是几个常用标记:

    1. LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR,DLL所在的目录。
    2. LOAD_LIBRARY_SEARCH_APPLICATION_DIR,应用程序目录。
    3. LOAD_LIBRARY_SEARCH_USER_DIRS,用户事先通过接口AddDllDirectorySetDllDirectory指定的一个或多个目录。
    4. LOAD_LIBRARY_SEARCH_SYSTEM32, 系统目录。

    参考

    1. https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order
    2. https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-loadlibraryexa
    展开全文
  •   国内一般操作系统为windows操作系统,但是mac系统在高端市场,也占据着一部分比率,开发Mac应用,需要先了解,Mac操作系统搜索动态库顺序。 1.搜索顺序   因为运行时动态库的搜索路径的先后顺序是:    ...
  • windows 下一个程序的dll搜索路径首先是程序目录,然后是一些系统目录。linux 下的可以通过设置 LD_LIBRARY_PATH 等方法来添加搜索路径,但是这些...添加完以上参数后,程序会优先从这个路径中查找动态库,$ORIGIN代
  • windows下应用程序加载动态链接路径依次分别是: 举例D盘soft文件夹下存在了一个test.exe的执行文件,即d:\soft\test.exe,依赖test.dll动态链接. ■程序的执行目录 test.exe执行文件存放在D盘下的soft文件平下,...
  • Ubuntu设置当前目录加载so动态库

    千次阅读 2018-10-15 14:24:53
    Ubuntu设置当前目录加载so动态库
  • Windows动态链接(dll)浅析 - 2 Windows动态链接(dll)浅析 - 1 Windows动态链接(dll)浅析 - 3 5. DLL的编写 5.1 一个简单的dll项目 上面用静态链接的方式提供了add函数接口,下来我们看看用动态链接...
  • 从接触sdk开发,到现在已经有3年多了,趁着这个时候总结一波在windows开发动态库(dll)时容易碰到的问题,做个笔记。有错误欢迎指出。 1.dll入口做资源初始化和去初始化不容易管理。建议专门对外提供初始化接口和...
  • 动态库是在程序运行时再进行加载的。 故本文讨论的链接与加载方式是指对动态库而言的。 一、动态库加载方式 1、隐式加载     就是我们需要准备好.h、.lib或者.so,对头文件进行包含,并添加对lib的链接命令,...
  • Windows动态库和静态库的总结

    千次阅读 2016-01-24 00:29:35
    Windows下的动态库编程并不很熟悉。下午利用一点时间写了个原型,过程中想到许多问题,网上搜到许多文章,学到不少知识,但感觉比较繁杂,于是决定理一理,就有了这篇博文。
  • windows中静态lib和动态dll的区别及使用方法 网上有很多关于这方面的说明,但是比较乱,感觉都说不清楚的样子。根据自己的理解以及查询资料,有些内容参考于网络,做一下总结:
  • windows加载动态库的时候,缺省是首先加载本地目录下的动态库,然后再搜索windows/system和windows/system32目录windows动态库搜索顺序,虽然有可能会造成潜在的混乱,但是对于开发和测试无疑是比较方便的,...
  • C++动态链接DLL文件的加载

    千次阅读 2021-12-03 16:08:35
    10.3 动态加载(Using Run-Time Dynamic Linking) 结语 Stands for “Dynamic Link Library.” A DLL (.dll) file contains a library of functions and other information that can be accessed by a Windows ...
  • 动态链接dll(Windows/C++)

    千次阅读 2022-04-07 21:31:47
    动态链接库只是将对外导出信息(声明)暴露给调用方,调用方在程序中仅依据暴露的信息进行使用,在编译期间,不会与动态链接库发生任何关系,只有在应用程序运行动态链接库所包含的功能时,动态库才被加载到进程空间...
  • linux的excutable在执行的时候缺省是...windows加载动态库的时候,缺省是首先加载本地目录下的动态库,然后再搜索windows/system和windows/system32目录windows动态库搜索顺序,虽然有可能会造成潜在的混乱,但是
  • linux的excutable在执行的时候...windows加载动态库的时候,缺省是首先加载本地目录下的动态库,然后再搜索windows/system和windows/system32目录windows动态库搜索顺序,虽然有可能会造成潜在的混乱,但是对...
  • 静态的调用方法 第一种:项目设置中引用,在项目的属性中设置。...在其中填入lib目录,也可以是相对或绝对路径。 步骤二: 右键单击项目—>属性—>配置属性—>链接器—>输入—>附加依赖项
  • Linux依赖查找顺序

    2021-03-31 18:02:07
    1.目录说明: /lib 根目录下的所程序的共享库目录。 此目录下包含系统引导和...目标文件,包括动态连接加上一些通常不是直接调用的可执行文件的存放位置。 这个目录功能类似/lib目录,理说,这里存放的文件应该是/b
  • System.load()与System.loadLibrary()方法均能够加载Windows环境、Linux环境下的动态库文件,而且不区分是封装好的JNI库文件或者非JNI库文件。 当带有native关键字的本地方法在被调用时,都会通过这两种方式之一将...
  • 1、优先加载目录下的动态链接 2、32位的系统会加载,System.Win,64位会加载XX(不明确) 3、加载环境变量下的dll
  • RUNPATH摘自http://gotowqj.iteye.com/blog/1926771 linux动态库加载RPATH, RUNPATH 链接动态库 如何程序在连接时使用了共享库,就必须在运行的时候能够找到共 ...Linux 动态库加载动态库运行时搜索顺序 1.LD_...
  • 动态链接库加载的两种方式

    千次阅读 2018-09-30 23:52:04
    目录 1. 隐式链接 xxx.lib -- 引入文件,保存的是xxx.dll中导出的函数和变量的符号名 xxx.dll -- 导出的动态链接 四大路径及顺序 ...2. 显式加载动态加载) 相关函数 参考阅读 示例代码 3...
  • 动态库的装载与卸载

    2021-03-09 07:24:07
    相关的三个函数:(LoadLibrary,GetProcAddress,FreeLibrary)动态载入 DLL...方法是:用 LoadLibrary 函数加载动态链接到内存,用 GetProcAddress函数动态获得 DLL 函数的入口地址。当一个 DLL 文件用 LoadLibrary ...
  • 包含目录 与 附加包含目录 的区别是 检索顺序 不同。 The compiler searches directories in the following order:(来自MSDN,一定要看英文) If specified using a#include directivein double-quote form, it...
  • windows加载动态库---LoadLibrary返回126

    千次阅读 2018-09-12 10:04:05
    前几天,在联网测试三方的dll,但是出现dll放到exe目录下面可以正常加载,如果单独放一个目录却出现126错误代码,找不到指定的模块。 由于三方dll使用zlib版本和exe使用的zlib版本不同,所以三方的dll又不能放到exe...
  • Linux 动态库 编译和使用

    千次阅读 2022-01-02 00:42:14
    前言: 动态链接库是程序运行时加载的库,当动态链接库正确部署之后,运行的多个程序可以使用同一个加载到内存中的动态库,因此在 Linux 中动态链接库也可称之为共享库。...在 Windows动态库一般

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 68,068
精华内容 27,227
热门标签
关键字:

windows动态库加载目录顺序