动态库

查看程序依赖的动态库—dumpbin和depends

此生再无相见时 提交于 2019-11-27 18:39:29
dumpbin是VS自带的工具,进入Visual Studio 2010 的命令提示 查看程序或动态库所依赖的动态库 dumpbin /dependents abc.exe 查看动态库的输出函数 dumpbin /exports abc.dll 另一款查看动态库依赖的小工具depends,官网 http://www.dependencywalker.com/ 来源: https://www.cnblogs.com/huyupei/p/11887742.html

LoadLibrary加载动态库失败

孤者浪人 提交于 2019-11-27 18:10:50
LoadLibrary加载动态库失败的可能原因以及解决方案: (1)dll动态库文件路径不对。此场景细分为以下几种情况: 1.1 文件路径的确错误 。比如:本来欲加载的是A文件夹下的动态库a.dll,但是经过仔细排查原因,发现a.dll动态库竟然被拷贝到B文件夹下去了。 若真遇到这种低级错误,建议你找个没人的墙角蹲下用小拇指逆时针划圈圈去吧。。。 1.2 实参传值错误。比如:实参类型为LPCWTR,经常都会因为字符串转换导致实参事与愿违。 网上的经验总结实例。某程序员经过一番周折后通过以下语句调用成功 hDll = LoadLibrary(TEXT("user32.dll")); 再经过一番百度google后发现,原来是字符格式惹的祸。 这里的LoadLibrary实际使用了LoadLibraryW而非LoadLibraryA,因此需要UNICODE字符串(宽字符串),而非窄字符串。 如下: #ifdef UNICODE #define LoadLibrary LoadLibraryW #else #define LoadLibrary LoadLibraryA #endif // !UNICODE 在C/C++代码中,直接使用""定义的字符串为窄字节串,而windows头文件中提供的TEXT宏可以根据是否定义了UNICODE宏来自动选择字符串类型。 因此,利用

lib 和 dll 的区别、生成以及使用详解(转)

末鹿安然 提交于 2019-11-27 15:57:21
原文章地址: https://www.cnblogs.com/TenosDoIt/p/3203137.html#c 首先介绍一下静态库(静态链接库)、动态库(动态链接库)的概念,首先两者都是代码共享的方式。 静态库 :在 链接 步骤中, 连接器将从库文件取得所需的代码,复制到生成的可执行文件(链接过程就已经复制好了)中 ,这种库称为静态库,其特点是exe中包含了 库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。即静态库中的指令都全部被直接包含在最终生成的 EXE 文件中 了。在vs中新建生成静态库的工程,编译生成成功后,只产生一个.lib文件 动态库 :动态链接库是一个包含 可由多个程序同时使用 的代码和数据的库,DLL不是可执行文件。动态链接(这就是它名字的由来)提供了一种方法,使进程可以调用不属于其可执行代码的函数(比如exe调用静态库函数时,这部分代码已经被复制到exe中了)。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。在vs中新建生成动态库的工程,编译成功后,产生一个.lib文件和一个.dll文件 那么上述静态库和动态库中的lib有什么区别呢? 静态库中的lib :该LIB包含函数代码本身(包括函数的索引+实现),在编译时直接将代码加入程序当中 动态库中的lib

Qt 动态库的创建和使用

你说的曾经没有我的故事 提交于 2019-11-27 12:53:30
Qt 动态库 动态库是经常用于给别人调用你模块的方法但是又不想人家知道你的代码。 Qt 动态库创建 在到最后完成就可以看到项目 将xxxx_global.h文件中的内容放到 dlldemo.h文件中 在.h和.cpp写自己的方法如图 然后编译就会有下面的界面 不用管 这样你的动态库就完成了 。下面是找到动态库的位置 动态库创建完成,下面是调用 这两个文件放在你要测试的工程下面 .dll文件配置 .h文件添加进来 .lib或者.a在pro下面添路径 测试 希望能给你带来帮助!!!!!!! 来源: https://blog.csdn.net/weixin_42692504/article/details/99676119

gcc/g++编译选项: -fPIC

旧时模样 提交于 2019-11-27 05:11:13
在理解PIC概念之前,先了解一下动态链接库的载入时重定位概念。 载入时重定位: 我们知道,Linux的可执行文件一般是elf格式的,在这个可执行文件的头部包含了很多重要的信息:如文件格式,加载地址,符号表等。当连接器链接生成可执行文件时,会将程序的加载地址写入可执行文件头。在程序运行时,动态加载器将可执行文件载入文件头指定的加载地址处,并加载该地址,开始从该地址处运行。由此可见,可执行文件的起始地址是在编译时就决定的: ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: Advanced Micro Devices X86-64 Version: 0x1 Entry point address: 0x4005b0 // 程序入口地址 Start of program headers: 64 (bytes into file) Start of section headers: 4472 (bytes into

Linux strace命令

我怕爱的太早我们不能终老 提交于 2019-11-27 05:07:48
简介 strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通 过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。 输出参数含义 root@ubuntu:/usr# strace cat /dev/ null execve( " /bin/cat ", [ " cat ", " /dev/null "], [ /* 22 vars */]) = 0 brk( 0) = 0xab1000 access( " /etc/ld.so.nohwcap ", F_OK) = - 1 ENOENT (No such file or directory) mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, - 1, 0) = 0x7f29379a7000 access( " /etc/ld.so.preload ", R_OK) = - 1 ENOENT (No such file or directory) ... brk( 0) = 0xab1000 brk( 0xad2000) = 0xad2000 fstat(

Wine开发系列之——入门

坚强是说给别人听的谎言 提交于 2019-11-27 03:03:58
说起Wine,稍微资深一点的Linux 用户应该都听过,但是真要说起Wine到底是怎么回事,可能大多数人不见得说得清。这篇文章会简单的介绍Wine的工作原理,以及如何开始Wine 的开发。 所以如果您属于以下三类读者之一: *想参与Wine开发,但是不知如何开始的。 *不认同Wine技术,仅仅想大致了解Wine是如何工作的。 *只是想能够愉快的用上最新版本Wine的。 希望在看完本文后,能够有一些收获。 Wine是什么 Wine是 “Wine Is Not an Emulator”的递归缩写,如同“GNU”一样(GNU’s Not Unix),字面意思就是Wine不是一个模拟器。这里的模拟器主要是指Wine并不是一个虚拟机,而是一个Windows API实现兼容层。 这么说可能不太好理解,大家可以把Windows应用程序类比成Android应用程序,而Wine 的角色就和Android很像了,将操作系统提供的各种功能封装成API,并让应用程序在隔离的环境内运行。至于API长成啥样,隔离的力度如何,这些都是实现相关的,和本质并不冲突。另一方面,Wine其实又是一个模拟器,不过模拟的对象不是硬件CPU,而是Windows 的行为。 Wine原理介绍 本节内容较为枯燥,需要对操作系统有一定的了解。如果只是想编译、运行,对原理不敢兴趣的同学,可以跳过,不影响后面的阅读。

动态库的加载

偶尔善良 提交于 2019-11-27 01:11:52
1、程序运行,要把需要的共享动态库装入内存。 2、在内存中,每个进程都有一份专属自己的数据,共享动态库中的代码段是共享的,只有一份,这样不会有问题吗? 3、因为代码段是只读的,多个人读,没有问题。去写代码段,程序要崩溃。 4、即使是数据段,为了效率,也是采用COW(Copy-On-Write),写时拷贝,比如linux中的fork。 转载于:https://www.cnblogs.com/nzbbody/p/4420198.html 来源: https://blog.csdn.net/weixin_30664539/article/details/99234813

GCC使用【转】

你说的曾经没有我的故事 提交于 2019-11-26 18:34:53
原文: http://blog.163.com/tyw_andy/blog/static/11679021201031582826251/ GCC使用 by Jian Lee GCC的选项 如何指定GCC的默认头 文件路径 Linux系统的头文件 和库文件搜索路径 头文件 库文件 运行时动态库的搜索路径 GCC的选项 -c 只生成目标文件(.o),不连接。 % gcc -c main.c % g++ -c reciprocal.cpp -I 可以指定头文件的目录 % g++ -c -I ../include reciprocal.cpp -D 设置宏定义 % g++ -c -D NDEBUG reciprocal.cpp % g++ -c -D NDEBUG=3 reciprocal.cpp -O 优化级别,默认优化级别是2 % g++ -c -O2 reciprocal.cpp -o 连接程序,生成可执行 如何指定GCC的默认头文件路径 有大量的环境变量可供设置以影响 GCC 编译程序的方式。利用这些变量 的控制也可使用合适的命令行选项。一些环境变量设置在目录名列表中。 这些名字和 PATH 环境变量使用的格式相同。特殊字符 PATH_SEPARATOR (安装编译程序的时候定义)用在目录名之间。在 UNIX 系统中,分隔符是冒号,而 Windows 系统中为分号。 C

python实现更换电脑桌面壁纸,锁屏,文件加密方式

人盡茶涼 提交于 2019-11-26 13:44:36
python实现更换壁纸和锁屏代码 #控制windows系统 import win32api,win32con,win32gui # 可以利用python去调用dll动态库的包、嵌入式开发 from ctypes import * # 时间 包控制程序的休眠时间 import time def desktop_img(bmp_path): # 打开windows注册表 HKEY_CURRENT_USER 并且设置属性 k = win32api.RegOpenKeyEx(win32con.HKEY_CURRENT_USER, "Control panel\\Desktop",0,win32con.KEY_SET_VALUE) #在HKEY_CURRENT_USER注册表中写入属性值,0表示桌面壁纸居中,2表示拉伸桌面 win32api.RegSetValueEx(k,"wapaperStyle",0,win32con.REG_SZ,"2") win32api.RegSetValueEx(k,"TileWallpaper",0,win32con.REG_SZ,"0") #刷新桌面 win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER,bmp_path,win32con.SPIF_SENDWININICHANGE)