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
和我的客户端程序只调用其中一个函数,它们的性能是否会因为所有其他额外函数未使用而降低?
不担心编译时间..只是实际运行时间
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
5. 我习惯于制作很多对象(.o 文件),然后将它们链接在一起以生成可执行文件。
将我的所有对象(通常是类)转换为 .so 文件然后将它们链接在一起会更好吗?
我知道可执行文件将依赖于 .so 文件,这与编译后可以删除对象的第一种方法不同,但是对此有什么建议?
6. 我对 -fPIC 和 -fpic 之间的区别有点不了解
我听说 -fPIC 将始终有效,而 -fpic 取决于目标。
目标依赖是什么意思?如果库总是要在同一台机器上编译和使用,我可以安全地使用 -fpic 吗?
最佳答案
dll's
是动态链接库,这意味着它们在运行时单独加载到内存中,这与编译期间嵌入模块中的静态链接库 (lib's
) 不同。 LoadLibrary
和 GetProcAddress
动态尝试调用函数而不实际链接库。 jmp
或 call
指令。 this
作为额外参数的非成员函数。 关于c++ - 简单的库问题 (C++),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8423918/