‘壹’ 包含文件、引用文件和库文件的区别
的本质区别,有一下几点:
a, 字节排序,一个int型的数据在windows里是由高地址存到低地址的4个字节的(假设是32位机器),但是在某些UNIX服务器,如AIX,它的排序方式就相反的,所以当程序被编译成低级语言(例如汇编)的时候,内存及CPU的处理就会截然相反
b, 字长,有些unix服务器是64位的,但大多WINDOWS是32位,那么定义一个整形的时候就有用8个字节和4个字节的区别,字长不一样,那么执行起来用对内存的使用也自然就不一样咯。
c,所谓的库,也是由编译器编译出来的,在不同的OS下,由同一个代码编译出来的库也会不一样。
d,编译器也各不相同,也会导致编译出程序不完全相同。
e,所谓的调用,也就是将程序和库一起打包,然后在找到库里面所定义的函数罢了
综上,当一个程序或者库要从其他OS搬到另一个不同规格的OS上的时候,一定要重新编译一下草能确保程序跑起来不发生错误,求其原因也就是因为OS的本质区别,兼容的话,其实就是看OS是否在规格上有没有本质区别
二,库文件的编译是单向的,所以无法取回源码,
.a库的打包例: ar r libabc.a a.o b.o c.o
将a.o b.o c.o 合并打包成libabc.a。注意哦(.a一定要以lib开始.a结束哦)
WIN下我不是很在行,你说的lib大包应该没错。
三,我不是很清楚
希望对你有帮助,我2年工作的精华
‘贰’ 编译器编译原理:预处理,编译,汇编,链接各步骤详解
编译器编译原理:预处理,编译,汇编,链接各步骤详解
C和C++编译器的编译流程主要分为四个阶段:预处理、编译、汇编和链接。预处理阶段主要处理源代码中的宏定义和包含文件,将包含的文件内容插入到源代码中。编译阶段则检查代码的语法正确性,并将其转换为汇编语言。汇编阶段将汇编语言转换为二进制机器指令。链接阶段则将生成的二进制文件与函数库链接,以实现程序功能。
在预处理阶段,编译器会将源代码中的文件包含进来,并且用户可以使用Gcc选项”-E”查看预处理的结果。预处理阶段主要处理# include和# define,它会将# include引用的.h文件插入到指定位置,并将源程序中使用到的宏替换为实际字符串。
编译阶段则检查代码的语法正确性,并将其转换为汇编语言。用户可以使用”-S”选项查看编译结果。编译阶段生成的文件是文本文件,可以直接用文本处理工具阅读。编译阶段可以接收.c和.i类型的文件。
汇编阶段将汇编语言转换为二进制机器指令,生成的目标文件可以直接执行。汇编阶段可以接收.c, .i, .s的文件。
链接阶段则将生成的目标文件与函数库链接,实现程序功能。函数库一般分为静态库和动态库两种,链接动态库和静态库时使用的方法是一样的,但是如果库中存在同名的静态库文件和动态库文件,链接时默认优先选择动态库。可以使用-static选项强制链接静态库文件。
完成链接后,编译器生成可执行文件,可以直接执行。通过运行可执行文件,可以验证程序功能是否实现。
‘叁’ 我现在想把自己写的python模块源代码封装成dll,然后在别的python脚本里调用,可以吗
可以的,只要把python模块转换成dll模块,利用Python自带的ctypes模块加载调用就行。
ctypes 是Python的外部函数库。它提供了与 C语言兼容的数据类型,并允许调用 DLL 或共享库中的函数。可使用该模块以纯 Python 形式对这些库进行封装。
ctypes导出了cdll对象,在 Windows 系统中还导出了windll和oledll对象用于载入动态链接库。通过操作这些对象的属性,你可以载入外部的动态链接库。cdll载入按标准的cdecl调用协锋滚议导出的函数,而windll导入的库按stdcall调用协议调用其中的函数。
(3)源码封库时引用的库怎么处理扩展阅读:
加载调用DLL的相关方法:
1、加载DLL银扒余
加载的时候要根据你将要调用的函数是符合什么调用约定的。
stdcall调用约定:两种加载方式
Objdll = ctypes.windll.LoadLibrary("dllpath")
Objdll = ctypes.WinDLL("dllpath")
cdecl调用约定:也有两种加载方式
Objdll = ctypes.cdll.LoadLibrary("dllpath")
Objdll = ctypes.CDLL("dllpath")
其实windll和cdll分别是WinDLL类和CDll类的对象。
2、调用dll中的方法
加载dll的时候会返回一个DLL对象(假设名字叫Objdll),利用该对象就可以调用dll中的方法。 e.g.如果dll中有个方法名字叫Add(注意如果经过stdcall声明的方法,如果不是用def文件声明的导出函数或者extern “C” 声明的话,编译器会对函数名进行修此旦改,这个要注意。)
调用:nRet = Objdll.Add(12, 15) 即完成一次调用。