哪些问题可以将静态库和动态库链接到同一个可执行文件中?

时间:2017-02-01 20:55:58

标签: c++ c dll static-linking dynamic-linking

我今天在面试时被问到这个问题。不幸的是,我不确定我是否正确地在这里复制了它。我记得,我不太了解它。问题可能是

  

“可以加载静态和动态编译的dll有什么问题   引起?“

我不知道答案,但面试官告诉我至少有两个主要问题

  1. 运行时库:可能存在一些不兼容的内存分配和解除分配。

  2. 不幸的是,我们被打断了,我们没有回到这个问题。

  3. 拜托,您能帮我理解这个问题可能是什么,以及答案是什么?

    我也不太了解第一点。我以为程序中只能有一个malloc,我错了吗?

2 个答案:

答案 0 :(得分:4)

让我们说A.dll与标准库版本1.0静态链接。它有一个看起来像这样的功能:

  char * f() {
     return malloc( 100 );   // uses malloc 1.0
  }

现在假设有另一个库B.dll与A.dll动态链接,静态链接到标准库1.1版。它的功能如下:

   void g() {
      char * p = f();  // returns the result of malloc 1.0
      free( p );   // uses free 1.1
   }

然后你可能(我说"可能"因为这些都不是标准化的)有一个指针,它是用标准库1.0动态分配的,但是它已经用版本1.1释放了。这通常会导致严重且难以诊断的问题。

答案 1 :(得分:1)

因为静态编译的dll是在运行时之前编译的,如果你需要改变任何东西(比如函数),你就必须重新编译.exe。静态编译的dll也比动态链接的dll大。动态链接的dll在运行时链接,因此每个程序都可以访问它们,因为所有函数在内存中都有特殊的位置,而没有它们的多个副本(就像它们被静态编译时一样)。希望这会有所帮助。