动态链接vs静态链接效率
Dynamic link vs. static link efficiency
我和另一个开发人员有一个争论,我想在这里解决动态链接和静态链接的问题。
在理论:假设你有一个包含100个函数的库,每个函数里面都有大量的代码:
int A()
int B()
int C()
..
..and so on...
并且您的应用程序只调用或依赖于其中一个。
你有两种方法可以使用。
- 将库构建为动态链接库
- 将库构建为静态链接库
谁是正确的?
这取决于代码的组织方式和使用的编译器标志。
经典后,简单的模型,链接器将在任何对象文件链接在图书馆需要满足符号引用,所以如果你的()、B()和C()都定义在不同的对象文件,只有对象文件,其中包含你实际使用的符号会链接到程序(除非它反过来依赖一个或多个其他的,在这种情况下,链接器会找到目标文件来满足这些引用,递归,直到它要么满足所有要求,要么找到一个不能满足的要求(这时您会得到标准的"Unresolved external XXX"错误消息)。
最近,大多数编译器可以将函数"打包"到单独的"模块"中,而不必将它们放入单独的源文件中以创建单独的目标文件。细节各不相同,但可以减少(或消除)使每个源文件尽可能小的必要性,以便将最终可执行文件中的内容保持在最小。
所以,至少在大多数情况下,他是对的,而你是错的。
看情况:-)
如果您将每个函数放在自己的源文件中,或者使用/Gy编译选项,则每个函数将被打包在静态库的单独部分中。
链接器将能够根据需要挑选它们,并且只包含实际调用的函数。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- CMake-按正确顺序将项目与C运行时对象文件链接
- 从链接列表c++中删除一个项目
- 有根的二进制搜索树.保留与其父级的链接
- 读取文件的最后一行并输入到链接列表时出错
- 静态数据成员的问题-修复链接错误会导致编译器错误
- node-gyp 在 macOS 上未正确链接库
- 基于boost的程序的静态链接——zlib问题
- 无法链接 CMake 中的本地库
- 内联函数中具有内部链接的全局变量
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 使用gcc从静态链接的文件中查找可选符号
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 下面是我为检测链接列表中的循环而制作的代码
- 有了gcc,是否可以链接库,但前提是它存在
- 使用C链接在函数内部创建C++模板
- Visual Studio mkl_link_tool.exe链接错误
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- 动态链接vs静态链接效率