Tre*_*key 3 c++ gcc shared dynamic libraries
1. 共享库和动态库是否完全相同?
windows只是将它们标记为.dll,并将linux标记为.so?
2.如果共享库具有程序使用的大量函数,那么这些函数何时加载到内存中?
在计划开始时?什么时候实际调用特定的函数?
3.如果我创建这样的库:
#ifndef SHARED_H
#define SHARED_H
#include <iostream>
#include <string>
namespace shared
{
void Function1(void);
void Function2(void);
void Function3(void);
void Function4(void);
void Function5(void);
void Function6(void);
...
void Function99(void);
void Function100(void);
...
}
//assume none of these functions call each other
#endif
Run Code Online (Sandbox Code Playgroud)
并且我的客户端程序只调用其中一个函数,由于未使用的所有其他额外函数,它们的性能会降低吗?
不担心编译时间..只是实际的运行时间
4.如果我使用课程,问题3的情况会有所不同:
#ifndef SHARED_H
#define SHARED_H
#include <iostream>
#include <string>
class Shared
{
public:
void Function1(void);
void Function2(void);
void Function3(void);
void Function4(void);
void Function5(void);
void Function6(void);
...
void Function99(void);
void Function100(void);
...
private:
protected:
};
//assume none of these functions call each other
#endif
Run Code Online (Sandbox Code Playgroud)
5.我使用,以使大量的对象(.o文件),然后将它们连接在一起,使我的可执行文件.
将所有对象(通常是类)转换为.so文件然后将它们链接在一起会更好吗?
我知道可执行文件将依赖于.so文件,不像第一种方法可以在编译后删除对象,但对此有何推荐?
6.我对-fPIC和-fpic之间的区别有点暗淡
我听说-fPIC将始终有效,-fpic是依赖于目标的.
目标依赖意味着什么?如果库总是要在同一台机器上编译和使用,我可以安全地使用-fpic吗?
其中一些问题可能是微不足道的,但我想确定我到目前为止所阅读的内容.我感谢任何和所有回复
*如果相关:使用gcc版本4.6.1(Ubuntu/Linaro 4.6.1-9ubuntu3)
对于第一和第二个问题: 在Windows Xp线程中有dll(动态链接库)作为组件.作为一个线程可以被视为轻量级进程.一个过程只不过是执行中的程序.(运行时).我猜dll和.so是相似的(可能存在变化,不确定)
外部库通常以两种形式提供:静态库和共享库.静态库是'.a'文件.当程序链接到静态库时,程序使用的任何外部函数的目标文件中的机器代码将从库中复制到最终的可执行文件中.
链接到共享库的可执行文件仅包含它所需的函数的小表,而不是来自外部函数的目标文件的完整机器代码.在可执行文件开始运行之前,外部函数的机器代码由操作系统从磁盘上的共享库文件复制到内存中 - 这个过程称为动态链接.动态链接使可执行文件更小并节省磁盘空间,因为可以在多个程序之间共享库的一个副本.
对于第三个问题:因为在共享库中只有函数表被加载而不是代码的实际助记符所以我们保存数据不像静态库,其中助记符是在编译时加载的.这可以从上面的解释中推断出来.
对于第5个问题:我认为只有当你知道你很少去那些函数时才会把它们变成'.so'更好.如果你打算经常使用这些函数,那么把那些包含lib的函数作为static.As在运行时获取它们会增加响应时间.