windows下/minGW/devc++ 使用静态链接库编译应用程序(多图)

windows环境下静态库和动态库的区别

  1. windows静态库扩展名.lib,区别与linux的.a
  2. windows动态链接库扩张名.dll,区别与linux的.so
  3. 动态库(.lib文件和.dll文件)
    在使用动态库的时候,编译后往往提供两个文件:一个引入库(.lib)文件(也称“导入库文件”)和一个DLL(.dll)文件。当然到了后面会告诉你如果只提供一个DLL文件,使用显示连接的方式也可以调用,只是稍加麻烦而已。
  4. 静态库(.lib)
    函数和数据被编译进一个二进制文件(通常扩展名为.LIB)。在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其他模块组合起来创建最终的可执行文件(.EXE文件)。当发布产品时,只需要发布这个可执行文件,并不需要发布被使用的静态库。

提问

  1. 动态链接库window和linux通用吗
    动态链接库在Windows和Linux系统上是不通用的。这是因为Windows和Linux使用不同的文件格式和链接方式来处理动态链接库。在Windows上,通常使用.dll(动态链接库)文件,而在Linux上使用.so(共享对象)文件。
    此外,即使是相同操作系统上的不同版本,也不能保证动态链接库的通用性,因为不同的操作系统版本可能使用不同的库版本或不同的ABI(应用程序二进制接口)。
    因此,如果您希望在不同的操作系统上使用动态链接库,您需要为每个操作系统构建相应的库文件。如果您想要跨平台使用相同的代码,您可能需要考虑静态链接库或其他跨平台的解决方案。

  2. centos上编译的程序可以在ubuntu上跑吗

    在许多情况下,CentOS上编译的程序可以在Ubuntu上运行,因为它们都是基于Linux的操作系统,并且遵循相似的标准。然而,有一些因素可能会影响程序在不同Linux发行版之间的可移植性,包括:

    1. 库的依赖性:如果程序依赖于特定于CentOS的库或版本,可能需要在Ubuntu上安装相应的库才能正常运行。

    2. 不同的库版本:不同的Linux发行版可能会使用不同版本的库,这可能会导致兼容性问题。

    3. 系统架构:如果程序是针对特定的处理器架构编译的(如x86、x86-64等),则需要确保目标系统支持相同的架构。

    在许多情况下,可以通过在目标系统上安装必要的库和依赖项来解决这些问题,或者重新编译程序以适应目标系统。但是,最好的做法是在目标系统上进行测试,以确保程序能够正常运行。

重点

  1. 虽然引入库的后缀名也是“lib”,但是,动态库的引入库文件和静态库文件有着本质的区别。对一个DLL文件来说,其引入库文件(.lib)包含该DLL导出的函数和变量的符号名,而.dll文件包含该DLL实际的函数和数据。在使用动态库的情况下,在编译链接可执行文件时,只需要链接该DLL的引入库文件,该DLL中的函数代码和数据并不可复制到可执行文件,直到可执行程序运行时,才去加载所需的DLL,将该DLL映射到进程的地址空间中,然后访问DLL中导出的函数。这时,在发布产品时,除了发布可执行文件以外,同时还需要发布该程序将要调用的动态链接库。

  2. 引入库LIb和静态库Lib的区别:
      引入库和静态库的区别很大,他们实质是不一样的东西。静态库本身就包含了实际执行代码、符号表等等,而对于引入库而言,其实际的执行代码位于动态库中,引入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。但是引入库文件的引入方式和静态库一样,要在链接路径上添加找到这些.lib的路径。

  3. 如何判断一个.lib文件是静态库还是动态库的导入库 https://blog.csdn.net/Liuqz2009/article/details/107789424

  • 安装msvs任何版本,会自动携带lib.exe程序
  • 安装目录查找lib.exe
    image
  • 运行 lib /list hello.lib 假设目标是hello
    如果输出: hello.obj,则是静态库
    如果输出: hello.dll,则是动态库的导入库。
    image
    将引入库lib对应的dll动态链接库放到生成的exe的根目录下,就可以直接运行了
posted @ 2023-11-16 11:14  学不会xuebuhui  阅读(428)  评论(0编辑  收藏  举报
Language: javascript