将静态库和动态库链接到同一个可执行文件会导致什么问题?
What problems can linking both static and dynamic libraries into the same executable cause?
我今天在面试时被问到这个问题。不幸的是,我不确定我在这里是否正确地复制了它。我只记得,我不太了解它。问题可能是
"What problems can loading statically and dynamically compiled dlls
cause?"
我不知道答案,但是面试官告诉我至少有两个主要问题:
运行时库:可能存在一些不兼容的内存分配和取消分配。
不幸的是,我们在这里被打扰了,我们没有回到这个问题。
请你帮我理解这个问题可能是什么,以及答案是什么?
第一点我也不是很理解。我以为一个程序只能有一个malloc
,我错了吗?
假设 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
}
然后你可能(我说 "probably" 因为 none 这是标准化的)有一个指针,它是用标准库 1.0 动态分配的,但在 1.1 版中被释放了。这通常会导致严重且难以诊断的问题。
因为静态编译的 dll 是在运行前编译的,如果您需要更改任何内容(比如函数),则必须 re-compile .exe。静态编译的 dll 也比动态链接的 dll 大。动态链接的 dll 在运行时链接,因此每个程序都可以访问它们,因为所有函数在内存中都有特殊的位置,没有它们的多个副本(就像它们被静态编译时一样)。希望这有帮助。
我今天在面试时被问到这个问题。不幸的是,我不确定我在这里是否正确地复制了它。我只记得,我不太了解它。问题可能是
"What problems can loading statically and dynamically compiled dlls cause?"
我不知道答案,但是面试官告诉我至少有两个主要问题:
运行时库:可能存在一些不兼容的内存分配和取消分配。
不幸的是,我们在这里被打扰了,我们没有回到这个问题。
请你帮我理解这个问题可能是什么,以及答案是什么?
第一点我也不是很理解。我以为一个程序只能有一个malloc
,我错了吗?
假设 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
}
然后你可能(我说 "probably" 因为 none 这是标准化的)有一个指针,它是用标准库 1.0 动态分配的,但在 1.1 版中被释放了。这通常会导致严重且难以诊断的问题。
因为静态编译的 dll 是在运行前编译的,如果您需要更改任何内容(比如函数),则必须 re-compile .exe。静态编译的 dll 也比动态链接的 dll 大。动态链接的 dll 在运行时链接,因此每个程序都可以访问它们,因为所有函数在内存中都有特殊的位置,没有它们的多个副本(就像它们被静态编译时一样)。希望这有帮助。