zoukankan      html  css  js  c++  java
  • DLL/LIB 静态与动态链接 MT/MD的区别

    这些东西算是编写C++大型软件在处理互相之间的依赖关系,或者编译开源库的时候会经常用到的知识,有时候经常会遇到一些让人崩溃的链接错误,比如 error LNK 201 205 等等,往往是配置不对引起的。在《Game Engine Architecture》中也专门花了一个章节讲这些事情,因此写下来仅供以后参考。

    我们都知道C++ 编译过之后会生成目标文件 也就是.obj 或者.o格式的文件。目标文件就是编译器翻译过的机器代码,但是目标文件并不能被机器执行,因为其内部的内存地址并没有被确定,同时所有的外部符号没有被解释(也就是没有连接) 而静态库lib就是obj文件的打包,linker用lib生成可以执行的exe文件的过程就是静态链接,这过程中要干的也就是两件事,确定内存的最终相对地址,解释所有的外部符号。

    而DLL是介于lib和exe之间的一种文件,可以像lib一样当成库使用,也可以单独被操作系统调用 和exe一样。通过DLL动态连接生成的exe包含部分已经完全解释的代码,但是所有的外部函数都是需要DLL本身才能解释的,这就是为啥经常看到一个程序缺少xxxDLL无法运行的原因。

    在VS或者CMake里可以指定工程的生成方式,大部分第三方的开源库是编译成lib的,这样可以方便自己开发的程序运行,不需要拷贝很多DLL。

    /MT和/MD 是关于多线程代码生成的一个选项,如果第三方库lib的生成和引用了这些库的工程生成方式不一致的话就会造成linker错误,因为/MT (多线程)和/MD(多线程DLL) 使用的分别是MSVCRT.lib 和 LIBCMT.lib 同时使用就会造成linker对两个lib中的同名函数分不清楚。

  • 相关阅读:
    c#FileStream文件读写(转)
    mvc Razor 视图中找不到 ViewBag的定义
    JS正则表达式验证账号、手机号、电话和邮箱
    jquery each循环,
    $.grep(array, callback, [invert])过滤,常用
    arguments 对象
    有关Select option 元素
    MVC零基础学习整理(一)
    根据年月日算出当前日期是星期几
    C# winfrom 模拟ftp文件管理
  • 原文地址:https://www.cnblogs.com/warpengine/p/3456483.html
Copyright © 2011-2022 走看看