算法小白的心得笔记:分清楚执行程序和动态链接库的编译方式。

简介: -fPIC 选项:这个选项告诉编译器生成位置无关代码(Position Independent Code)。这种代码同样可以在内存的任何位置执行,因为它使用的是相对地址而不是绝对地址。这对于动态库是必要的,因为动态库在被加载时,其在内存中的位置是不确定的。

问题描述

在写代码的时候,将一个matlab算法转化为c++ 格式,测试完成运行时间之后,打算打成动态库,直接修改了编译链接参数宏,发现不能够运行编译成的程序了。


解决方式

修改编译链接参数宏,将-shared 或 -fPIC选项从编译程序时去掉,只在动态库生成时使用。


思考

为什么-shared 或 -fPIC这两个参数会产生这样的影响?原因是什么?它在编译链接时干了什么事情?


-shared 和 -fPIC 都是 GCC 编译器的选项,它们通常用于生成动态链接库。

-shared 选项告诉编译器生成一个共享对象,可以链接到其他对象中。这通常用于创建动态链接库。

-fPIC 选项告诉编译器生成位置无关代码(Position Independent Code)。这意味着生成的代码可以在内存中的任何位置执行,这对于动态链接库是必要的,因为你无法预先知道代码将在内存中的哪个位置执行。

然而,如果你的目标不是创建一个动态链接库,而是一个可执行文件,那么 -shared 和 -fPIC 选项可能会导致问题。这是因为这些选项会改变编译器生成代码的方式,可能会导致生成的代码无法正确执行。


在我的情况下,由于我的目标是生成一个可执行文件,而不是一个动态链接库,所以去掉 -shared 和 -fPIC 选项后问题就解决了。


在编译过程中,编译器会将源代码转换为机器代码,这个过程中会涉及到很多的细节,其中一部分就是如何处理内存地址。这就是 -shared 和 -fPIC 选项涉及到的内容。


1.-shared 选项:这个选项告诉编译器生成的是一个动态库,也就是说,这个库在编译的时候并不知道它将会被加载到内存的什么位置,因此,它生成的代码需要能够在被加载到内存的任何位置后都能正确运行。这就需要编译器生成一种特殊的代码,这种代码在引用内存地址时,不是直接引用具体的地址,而是使用相对于当前代码位置的偏移量来引用。这样,无论代码被加载到内存的什么位置,这些引用都能正确工作。


2.-fPIC 选项:这个选项告诉编译器生成位置无关代码(Position Independent Code)。这种代码同样可以在内存的任何位置执行,因为它使用的是相对地址而不是绝对地址。这对于动态库是必要的,因为动态库在被加载时,其在内存中的位置是不确定的。


然而,如果你的目标是生成一个可执行文件,那么情况就不同了。可执行文件在被加载到内存时,其位置是由操作系统决定的,而且一旦确定就不会改变。因此,可执行文件中的代码可以直接使用绝对地址,而不需要使用相对地址。这样可以简化代码,提高执行效率。


如果你在编译可执行文件时使用了 -shared 或 -fPIC 选项,那么编译器会生成适用于动态库的代码,这种代码在执行时需要额外的步骤来处理地址引用,这可能会导致效率降低,甚至在某些情况下无法正确执行。这就是为什么在编译可执行文件时,不应该使用 -shared 和 -fPIC 选项的原因。


分享一个有趣的 学习链接:https://xxetb.xet.tech/s/HY8za

目录
相关文章
|
1月前
|
算法 安全 数据安全/隐私保护
Crypto++库支持多种加密算法
【10月更文挑战第29天】Crypto++库支持多种加密算法
91 4
|
2月前
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
79 1
|
2月前
|
算法 索引
❤️算法笔记❤️-(每日一刷-141、环形链表)
❤️算法笔记❤️-(每日一刷-141、环形链表)
53 0
|
2月前
|
算法
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
53 0
|
2月前
|
算法
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
36 0
|
2月前
|
存储 算法
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
112 0
|
27天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
61 1
|
1月前
|
存储 缓存 算法
通过优化算法和代码结构来提升易语言程序的执行效率
通过优化算法和代码结构来提升易语言程序的执行效率
|
1月前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
49 3
|
2月前
|
存储 缓存 算法
如何通过优化算法和代码结构来提升易语言程序的执行效率?
如何通过优化算法和代码结构来提升易语言程序的执行效率?

热门文章

最新文章