我读过静态和动态库。 我的问题是小规模的
dlopen dlclose:
Benifit of dlopen is we can start the EXE with out
loading the necessary libraries at the begining. Only when we
need we will load the libratries and unload it from the memory.
这是动态链接库的行为。
我的问题是,如果我链接库libUtlities
ld -o EXE main.o -lUtilities
当我运行EXE时,libUtlities将被加载到内存中 我首先使用那里的功能
which i observed in dbx (Solaris debugger)
But will not contribute to the size of the EXE.
1.它是静态链接还是动态链接。吗
答案 0 :(得分:9)
不幸的是,“静态”和“动态”这些词语 way 过度使用,尤其是在C和C ++中。所以,我更喜欢以下术语:
链接时链接,a.k.a“静态链接”:所有符号在链接时从静态库中解析。结果是一个单片,静态链接的可执行文件,没有加载时依赖性。
加载时链接:这是现代平台上的标准做法,在共享库(Unix)或不幸名为动态链接库中查找未解析的符号(DLLS)并且只在链接时记录引用,符号的实际分辨率和代码加载在加载时发生。
这会生成“动态链接”的可执行文件,必须使用 loader (例如Linux上的ld.so
)加载。加载是操作系统的一部分,通常对用户是透明的,但它可以检查(例如在Linux上使用ldd
)。所有共享库必须在加载时可用,否则程序将无法启动。
运行时链接,a.k.a。“动态链接”:没有未解析的符号;相反,运行时动态决定使用dlopen()
或LoadLibrary()
在共享/动态库中查找符号。找不到符号是一个可处理的运行时条件,不是错误。这种技术通常用于插件架构,在Windows上用于代码注入。
但请注意,Linux的共享对象与Windows的DLL之间存在根本的技术差异,它们不仅仅是具有不同名称的相同内容。但是,它们都可以用于加载时和链接运行时。
答案 1 :(得分:3)
这是动态链接。它与dlopen dlclose
无关。通过dlopen
,您可以手动打开动态库并调用从中导出的函数。通过动态链接,所有这些工作都由链接器完成。静态链接链接到静态库(.a
文件)。通过静态链接,库中的代码链接到你的exe中,增加了它的大小。