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

简介: -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月前
|
机器学习/深度学习 算法 Python
请解释Python中的随机森林算法以及如何使用Sklearn库实现它。
【2月更文挑战第28天】【2月更文挑战第101篇】请解释Python中的随机森林算法以及如何使用Sklearn库实现它。
|
1月前
|
算法 搜索推荐 Java
数据结构与算法(Java篇)笔记--希尔排序
数据结构与算法(Java篇)笔记--希尔排序
|
1月前
|
机器学习/深度学习 存储 算法
【算法沉淀】刷题笔记:并查集 带权并查集+实战讲解
【算法沉淀】刷题笔记:并查集 带权并查集+实战讲解
|
2月前
|
编解码 算法
m基于码率兼容打孔LDPC码nms最小和译码算法的LDPC编译码matlab误码率仿真
m基于码率兼容打孔LDPC码nms最小和译码算法的LDPC编译码matlab误码率仿真
20 0
|
2月前
|
编解码 算法
m基于码率兼容打孔LDPC码oms最小和译码算法的LDPC编译码matlab误码率仿真
m基于码率兼容打孔LDPC码oms最小和译码算法的LDPC编译码matlab误码率仿真
35 0
|
1月前
|
机器学习/深度学习 算法 程序员
C++ Algorithm 库 算法秘境探索(Algorithm Wonderland Exploration)
C++ Algorithm 库 算法秘境探索(Algorithm Wonderland Exploration)
75 1
|
3月前
|
算法 5G
基于LDPC编译码和FP-MAP球形检测算法的协作MIMO系统误码率matlab仿真
基于LDPC编译码和FP-MAP球形检测算法的协作MIMO系统误码率matlab仿真
|
1月前
|
机器学习/深度学习 算法 数据挖掘
请解释Python中的决策树算法以及如何使用Sklearn库实现它。
决策树是监督学习算法,常用于分类和回归问题。Python的Sklearn库提供了决策树实现。以下是一步步创建决策树模型的简要步骤:导入所需库,加载数据集(如鸢尾花数据集),划分数据集为训练集和测试集,创建`DecisionTreeClassifier`,训练模型,预测测试集结果,最后通过`accuracy_score`评估模型性能。示例代码展示了这一过程。
|
1月前
|
机器学习/深度学习 算法 数据可视化
请解释Python中的K-means聚类算法以及如何使用Sklearn库实现它。
【2月更文挑战第29天】【2月更文挑战第104篇】请解释Python中的K-means聚类算法以及如何使用Sklearn库实现它。
|
1月前
|
缓存 算法 C语言
【C++ 标准查找算法 】C++标准库查找算法深入解析(In-depth Analysis of C++ Standard Library Search Algorithms)
【C++ 标准查找算法 】C++标准库查找算法深入解析(In-depth Analysis of C++ Standard Library Search Algorithms)
48 0