静态库和共享库有什么区别?
我使用Eclipse,有几种项目类型,包括静态库和共享库?一个人比另一个人有优势吗?
我知道.so文件是一种动态库(许多线程可以共享这些库,因此不需要在内存中有多个副本).但是.a和之间有什么区别.la?这些都是静态库吗?
如果动态库比静态库有很大的优势,为什么还有很多静态库呢?
我还想知道加载库(两种类型)的基本机制,以及在某个地方使用它时如何调用lib中的一段代码.我应该学习哪一部分内核?我应该知道哪些相关的Linux命令/实用程序才能知道进程是如何运行的?(我现在才知道ld命令)
我什么时候应该尝试构建代码.so或.a?哪一个更好?
[mirror@home ins_openvpn]$ ls lib/openvpn/plugins/ -l
total 96
-rw-r--r-- 1 mirror mirror 22892 Sep 2 23:25 openvpn-plugin-auth-pam.a
-rwxr-xr-x 1 mirror mirror 931 Sep 2 23:25 openvpn-plugin-auth-pam.la
-rwxr-xr-x 1 mirror mirror 23621 Sep 2 23:25 openvpn-plugin-auth-pam.so
-rw-r--r-- 1 mirror mirror 17228 Sep 2 23:25 openvpn-plugin-down-root.a
-rwxr-xr-x 1 mirror mirror 932 Sep 2 23:25 openvpn-plugin-down-root.la
-rwxr-xr-x 1 mirror mirror 18805 Sep 2 23:25 openvpn-plugin-down-root.so
Run Code Online (Sandbox Code Playgroud) linux memory-management shared-libraries ld static-libraries
有时当我在.so文件上执行nm(例如,libstdc ++.so.6)时,它没有说明符号,我需要使用nm --dynamic.但对于其他一些.so文件,我可以看到没有--dynamic的符号.
医生说:
显示动态符号而不是普通符号.这仅对动态对象有意义,例如某些类型的共享库.
但令人困惑的是......共享库的"类型"需要什么 - 动态?这是如何确定的?在编译图书馆期间?我认为所有共享库都是动态的(我的意思是,可以在运行时动态加载),但似乎我的理解不太对.