Repository navigation
Expand file tree
/
Copy pathdifference-between-static-and-shared-libraries.html
More file actions
216 lines (148 loc) · 10.8 KB
/
Copy pathdifference-between-static-and-shared-libraries.html
File metadata and controls
216 lines (148 loc) · 10.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
<!DOCTYPE html>
<html>
<head>
<!-- [[! Document Settings ]] -->
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!-- [[! Page Meta ]] -->
<title>Difference between static and shared libraries</title>
<meta name="description" content="与机器,人,神共舞 - 编程,读书,思考,旅行,与机器对话,与人交谈,对神发问,探索,体验人生美丽的风景" />
<meta name="HandheldFriendly" content="True" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="shortcut icon" href="/assets/images/favicon.ico" >
<!-- [[! Styles'n'Scripts ]] -->
<link rel="stylesheet" type="text/css" href="/assets/css/screen.css" />
<link rel="stylesheet" type="text/css"
href="//fonts.googleapis.com/css?family=Merriweather:300,700,700italic,300italic|Open+Sans:700,400" />
<link rel="stylesheet" type="text/css" href="/assets/css/syntax.css" />
<!-- [[! Ghost outputs important style and meta data with this tag ]] -->
<link rel="canonical" href="/" />
<meta name="referrer" content="origin" />
<link rel="next" href="/page2/" />
<meta property="og:site_name" content="与机器,人,神共舞" />
<meta property="og:type" content="website" />
<meta property="og:title" content="与机器,人,神共舞" />
<meta property="og:description" content="编程,读书,思考,旅行,与机器对话,与人交谈,对神发问,探索,体验人生美丽的风景" />
<meta property="og:url" content="/" />
<meta property="og:image" content="/assets/images/cover1.jpg" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="与机器,人,神共舞" />
<meta name="twitter:description" content="编程,读书,思考,旅行,与机器对话,与人交谈,对神发问,探索,体验人生美丽的风景" />
<meta name="twitter:url" content="/" />
<meta name="twitter:image:src" content="/assets/images/cover1.jpg" />
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "Website",
"publisher": "Tao's Page",
"url": "/",
"image": "/assets/images/cover1.jpg",
"description": "编程,读书,思考,旅行,与机器对话,与人交谈,对神发问,探索,体验人生美丽的风景"
}
</script>
<meta name="generator" content="Jekyll 3.0.0" />
<link rel="alternate" type="application/rss+xml" title="与机器,人,神共舞" href="/rss.xml" />
</head>
<body class="home-template nav-closed">
<div class="nav">
<h3 class="nav-title">Menu</h3>
<a href="#" class="nav-close">
<span class="hidden">Close</span>
</a>
<ul>
<li class="nav-home " role="presentation"><a href="/">Home</a></li>
<li class="nav-about " role="presentation"><a href="/about.html">About</a></li>
<li class="nav-fables " role="presentation"><a href="/tag/machine/">Machine</a></li>
<li class="nav-speeches " role="presentation"><a href="/tag/human/">Human</a></li>
<li class="nav-fiction " role="presentation"><a href="/tag/god/">God</a></li>
<li class="nav-author " role="presentation"><a href="/author/hetao/">Author</a></li>
</ul>
<a class="subscribe-button icon-feed" href="/vocab.html">Apps</a>
</div>
<span class="nav-cover"></span>
<div class="site-wrapper">
<!-- [[! Everything else gets inserted here ]] -->
<!-- default -->
<!-- The comment above "< default" means - insert everything in this file into -->
<!-- the [body] of the default.hbs template, which contains our header/footer. -->
<!-- Everything inside the #post tags pulls data from the post -->
<!-- #post -->
<header class="main-header post-head no-cover">
<nav class="main-nav clearfix">
</nav>
</header>
<main class="content" role="main">
<article class="post tag-machine">
<header class="post-header">
<h1 class="post-title">Difference between static and shared libraries</h1>
<section class="post-meta">
<!-- <a href='/'>Tao He</a> -->
<time class="post-date" datetime="2011-03-16">16 Mar 2011</time>
<!-- [[tags prefix=" on "]] -->
on
<a href='/tag/machine'>Machine</a>
</section>
</header>
<section class="post-content">
<p>In software development, libraries are essential components that provide reusable code to streamline and enhance programming. These libraries come in two main forms: shared libraries and static libraries. Understanding the differences between them, as well as their respective advantages and disadvantages, is crucial for making informed decisions in software development.</p>
<h4 id="shared-libraries">Shared Libraries</h4>
<p>Shared libraries, represented by .so files on Unix-based systems, .dll files on Windows, and .dylib files on macOS, contain all the necessary code within a single file. Programs that utilize these libraries reference the required code at runtime. This means that only the code actually used by the program is linked dynamically, reducing the overall size of the binaries.</p>
<p>One significant advantage of shared libraries is their ability to minimize code duplication across programs. By referencing a single shared library, multiple programs can stay lightweight. Additionally, shared libraries can be updated independently of the programs that use them. Replacing a shared library with a newer version that offers performance improvements or bug fixes can be done without recompiling the dependent programs. Shared libraries are also instrumental in implementing binary plug-in systems, as they can be loaded into an application at runtime.</p>
<p>However, shared libraries come with some drawbacks. They introduce a small performance overhead due to the runtime linking process, where all symbols in the library must be resolved. Moreover, there is a cost associated with loading the library into memory during program startup.</p>
<h4 id="static-libraries">Static Libraries</h4>
<p>Static libraries, typically in .a files on Unix-based systems and .lib files on Windows, are linked directly into the program at compile time. Unlike shared libraries, static libraries embed copies of the necessary code within the program itself. This approach eliminates the need for external library files at runtime, ensuring that the program is self-contained.</p>
<p>The primary advantage of static libraries is the absence of runtime loading costs. Since the code is already part of the binary, the program can start and execute without any additional linking overhead. This makes static libraries particularly useful in environments where minimizing external dependencies is critical. However, static libraries also have their disadvantages. They increase the overall size of the binary because the library code is duplicated in each program that uses it.</p>
<h4 id="practical-considerations">Practical Considerations</h4>
<p>Choosing between shared and static libraries often depends on the specific requirements and constraints of a project. Shared libraries are preferred when reducing binary size and maintaining ease of updates are priorities. They are also beneficial for implementing plug-in systems due to their runtime loading capabilities.</p>
<p>On the other hand, static libraries are ideal when creating self-contained binaries with no external dependencies. This can be particularly important in situations where meeting specific library versions, such as certain versions of the C++ standard library or Boost C++ library, might be challenging.</p>
<p>In my personal experience, I tend to favor shared libraries for their flexibility and efficiency in managing code updates. However, I opt for static libraries when the goal is to ensure that the binary is independent of external libraries, thus avoiding potential compatibility issues.</p>
<h4 id="conclusion">Conclusion</h4>
<p>Both shared and static libraries have their unique advantages and disadvantages. Shared libraries excel in reducing binary sizes and facilitating updates, while static libraries provide self-contained binaries with no runtime linking costs. The choice between the two depends on the specific needs of the project, including considerations of dependency management, performance, and binary size. Understanding these trade-offs allows developers to make informed decisions to optimize their software’s functionality and maintainability.</p>
</section>
<footer class="post-footer">
<!-- Everything inside the #author tags pulls data from the author -->
<!-- #author-->
<!-- Add Disqus Comments -->
</footer>
</article>
</main>
<aside class="read-next">
<!-- [[! next_post ]] -->
<a class="read-next-story no-cover" href="/stl-or-qt-containers">
<section class="post">
<h2>STL or Qt containers</h2>
<p>Choosing the right data structures and adhering to consistent coding conventions are crucial decisions in...</p>
</section>
</a>
<!-- [[! /next_post ]] -->
<!-- [[! prev_post ]] -->
<a class="read-next-story prev no-cover" href="/segmentation-fault">
<section class="post">
<h2>Segmentation-fault in C++</h2>
<p>A segmentation fault, commonly referred to as a segfault, is a specific error that occurs...</p>
</section>
</a>
<!-- [[! /prev_post ]] -->
</aside>
<!-- /post -->
<footer class="site-footer clearfix">
<section class="copyright"><a href="/">与机器,人,神共舞</a> © 2024</section>
</footer>
</div>
<!-- [[! Ghost outputs important scripts and data with this tag ]] -->
<script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
<!-- [[! The main JavaScript file for Casper ]] -->
<script type="text/javascript" src="/assets/js/jquery.fitvids.js"></script>
<script type="text/javascript" src="/assets/js/index.js"></script>
<!-- Add Google Analytics -->
<!-- Google Analytics Tracking code -->
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-78960009-1', 'auto');
ga('send', 'pageview');
</script>
</body>
</html>