‘壹’ 为什么gcc的编译时搜索动态库路径(-l)和执行时搜索动态库
动态链接库在编译时与执行时的路径搜索机制,体现了编程语言设计上的差异与挑战。动态链接库的code不直接嵌入执行文件中,而是在链接时动态加载所需的库。执行文件仅保留链接信息,指示哪些.so文件需要加载。
编译过程记录了这些链接信息,确保执行文件能在不同环境下运行。然而,这些机器的库安装路径可能与编译环境不同,如Ubuntu与CentOS系统,这就需要生产环境的机器自行配置库路径。
这种分离机制虽然保证了灵活性,但也带来了挑战。不同环境下的库路径配置可能引发问题,增加部署复杂性。C和C++在动态链接库管理上的局限性,促使开发者探索其他语言解决方案。例如,Java虚拟机(JVM)提供了"一次编译,全球运行"的便利性,简化了跨平台部署。
综上所述,动态链接库在编译时与执行时的路径搜索体现了跨平台编程的复杂性与多样性。C和C++面临的问题促使开发者寻求更优雅的解决方案,而JVM等其他语言通过优化设计,提供了更好的跨平台兼容性与部署体验。
‘贰’ C++动态链接库(DLL)的创建和调用
一、理解库
库的使用能显着提升编程效率,避免重复编写已有的功能代码,提高代码的可读性,且便于在不同项目中重复利用代码。
二、动态库与静态库
动态库在运行时加载,而静态库则在编译阶段与目标文件打包,形成可执行文件的一部分。
静态库优点:可执行文件依赖项少,编译阶段完成链接,执行期间代码装载速度快,缺点:可执行文件变大,作为依赖库时造成多余副本,升级时需重新编译。
动态库优点:实现进程间资源共享,升级程序简单,缺点:运行期间加载导致执行速度减慢,增加程序依赖项。
三、动态链接库(DLL)创建步骤
在Visual Studio中创建新动态链接库项目,完成头文件(.h)和源文件(.cpp)的创建与编写,使用__declspec属性关键字指定符号的导入导出,并在.cpp文件中实现函数,生成解决方案后,即可得到动态库文件。
四、动态链接库(DLL)调用方法
调用动态库有两种方式,隐式加载和显示加载。隐式加载需将动态库与相关文件放置于特定目录下,显式加载则使用LoadLibrary()函数进行加载。
实现隐式加载:创建测试项目,将动态库和相关文件拷贝至项目目录,添加头文件引用和依赖项,编写调用代码并查看结果。
至此,动态链接库的创建与调用过程完成,大大提高了开发效率与代码复用性。
‘叁’ dll库和lib库有什么区别
关于dll库和lib库的区别如下:
1、使用场景不同:lib是编译时用到的,dll是运行时用到的。
如果要完成源代码的编译,只需要 lib;如果要使动态链接的程序运行起来,只需要dll。
2、用途不同:如果有dll文件,那么lib一般是一些索引信息,记录了dll中函数的入口和位 置,dll中是函数的具体内容;如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。
使用静态编译的lib文件,在运行程序时 不需要再挂动态库,缺点是导致应用程序比较大,而且失去了动态库的灵活性,发布新版本时要发布新的应用程序才可以。
3、应用对象不同:动态链接的情况下,有两个文件:一个是LIB文件,一个是DLL文件。LIB包含被DLL导出的函数名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到DLL 文件。
在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中相应函数代码的地址,从而节省了内存资源。
DLL和LIB文件必须随应用程序 一起发行,否则应用程序会产生错误。如果不想用lib文件或者没有lib文件,可以用WIN32 API函数LoadLibrary、GetProcAddress装载。

(3)动态链接编译为什么需要库文件扩展阅读:
dll库和lib库使用方法:
1、使用lib的方法:
静态lib中,一个lib文件实际上是任意个obj文件的集合,obj文件是cpp文件编译生成的。在编译这种静态库工程时,不会遇到链接错误;即使有错,也只会在使用这个lib的EXT文件或者DLL工程里暴露出来。
在VC中新建一个static library类型的工程Lib,加入test.cpp文件和test.h文件(头文件内包括函数声明),然后编译,就生成了Lib.lib文件。
2、使用dll的方法:
使用动态链接中的lib,不是obj文件的集合,即里面不会有实际的实现,它只是提供动态链接到DLL所需要的信息,这种lib可以在编译一个DLL工程时由编译器生成。
参考资料来源:网络—lib
参考资料来源:网络—dll
‘肆’ 动态编译和静态编译有何主要区别
静态编译与动态编译的区别
1、动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令。所以其优点一方面是缩小了执行文件本身的体积,另一方面是加快了编译速度,节省了系统资源。缺点一是哪怕是很简单的程序,只用到了链接库中的一两条命令,也需要附带一个相对庞大的链接库;二是如果其他计算机上没有安装对应的运行库,则用动态编译的可执行文件就不能运行。
2、静态编译就是编译器在编译可执行文件的时候,将可执行文件需要调用的对应动态链接库(.so)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库。所以其优缺点与动态编译的可执行文件正好互补。