[DEV] add v1.76.0

This commit is contained in:
2021-10-05 21:37:46 +02:00
parent a97e9ae7d4
commit d0115b733d
45133 changed files with 4744437 additions and 1026325 deletions

View File

@@ -0,0 +1,75 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Acknowledgements</title>
<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
<link rel="up" href="../boost_dll.html" title="Chapter 14. Boost.DLL">
<link rel="prev" href="revision_history.html" title="Revision History">
<link rel="next" href="../foreach.html" title="Chapter 15. Boost.Foreach">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
<td align="center"><a href="../../../index.html">Home</a></td>
<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="revision_history.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../boost_dll.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../foreach.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="boost_dll.acknowledgements"></a><a class="link" href="acknowledgements.html" title="Acknowledgements">Acknowledgements</a>
</h2></div></div></div>
<p>
In order of helping and advising:
</p>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">
Renato Tegon Forti for starting the <code class="computeroutput"><span class="identifier">shared_library</span></code>
class and writing many code lines for Boost.DLL.
</li>
<li class="listitem">
Hartmut Kaiser for requesting a lot of cool functionality that is now part
of Boost.DLL.
</li>
<li class="listitem">
Niall Douglas for generating a lot of ideas.
</li>
<li class="listitem">
Vladimir Prus (the review manager) and all the library reviewers for making
good notes and proposing improvements to the library.
</li>
<li class="listitem">
Rodrigo Madera for helping with MacOS debugging and fixing platform related
issues.
</li>
<li class="listitem">
Dmitry Moskalchuk for helping with Android debugging and jamfiles.
</li>
<li class="listitem">
Klemens Morgenstern for implementing the mangled symbols loading by unmangled
name, feature that was thought to be impossible.
</li>
</ul></div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright © 2014 Renato Tegon Forti, Antony Polukhin<br>Copyright © 2015 Antony Polukhin<br>Copyright © 2016 Antony Polukhin, Klemens Morgenstern<br>Copyright © 2017-2021 Antony Polukhin<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="revision_history.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../boost_dll.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../foreach.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,68 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Dependencies</title>
<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
<link rel="up" href="../boost_dll.html" title="Chapter 14. Boost.DLL">
<link rel="prev" href="design_rationale.html" title="Design Rationale">
<link rel="next" href="revision_history.html" title="Revision History">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
<td align="center"><a href="../../../index.html">Home</a></td>
<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="design_rationale.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../boost_dll.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="revision_history.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="boost_dll.dependencies"></a><a class="link" href="dependencies.html" title="Dependencies">Dependencies</a>
</h2></div></div></div>
<p>
The Boost.DLL is a header only library, but it depends on the following libraries
and they must be available in order to compile programs that use Boost.DLL:
</p>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">
Boost.System for the boost::system::error_code and boost::system::system_error
classes.
</li>
<li class="listitem">
Boost.Filesystem for directory manipulation.
</li>
</ul></div>
<p>
Refcountable part of Boost.DLL also depends on:
</p>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">
Boost.Function for creation of a callback system.
</li>
<li class="listitem">
Boost.SharedPtr for reference counting.
</li>
</ul></div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright © 2014 Renato Tegon Forti, Antony Polukhin<br>Copyright © 2015 Antony Polukhin<br>Copyright © 2016 Antony Polukhin, Klemens Morgenstern<br>Copyright © 2017-2021 Antony Polukhin<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="design_rationale.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../boost_dll.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="revision_history.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,176 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Design Rationale</title>
<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
<link rel="up" href="../boost_dll.html" title="Chapter 14. Boost.DLL">
<link rel="prev" href="f_a_q_.html" title="F.A.Q.">
<link rel="next" href="dependencies.html" title="Dependencies">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
<td align="center"><a href="../../../index.html">Home</a></td>
<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="f_a_q_.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../boost_dll.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="dependencies.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="boost_dll.design_rationale"></a><a class="link" href="design_rationale.html" title="Design Rationale">Design Rationale</a>
</h2></div></div></div>
<div class="toc"><dl class="toc">
<dt><span class="section"><a href="design_rationale.html#boost_dll.design_rationale.abi_portability_across_compilers">ABI
portability across compilers</a></span></dt>
<dt><span class="section"><a href="design_rationale.html#boost_dll.design_rationale.user_s_plugin_api">User's
plugin API</a></span></dt>
<dt><span class="section"><a href="design_rationale.html#boost_dll.design_rationale.performance_and_memory_allocations">Performance
and memory allocations</a></span></dt>
<dt><span class="section"><a href="design_rationale.html#boost_dll.design_rationale.self_loading">Self loading</a></span></dt>
<dt><span class="section"><a href="design_rationale.html#boost_dll.design_rationale.aliases_vs_mangling">Aliases
vs Mangling</a></span></dt>
</dl></div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_dll.design_rationale.abi_portability_across_compilers"></a><a class="link" href="design_rationale.html#boost_dll.design_rationale.abi_portability_across_compilers" title="ABI portability across compilers">ABI
portability across compilers</a>
</h3></div></div></div>
<p>
During discussion of the library a lot of questions were about ABI stability
and should the library take care about it. It was decided that making ABI
stable could be a useful feature, but it will add a lot of overhead and make
the library usage less simple. For those who do not require ABI stability
across compilers such feature will be an overkill.
</p>
<p>
It was decided to make this library more simple and low level, so that it
could be used to make ABI stable plugins system for users that require it
still not adding overhead for other users.
</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_dll.design_rationale.user_s_plugin_api"></a><a class="link" href="design_rationale.html#boost_dll.design_rationale.user_s_plugin_api" title="User's plugin API">User's
plugin API</a>
</h3></div></div></div>
<p>
There are some open C++ plugin systems. Most of them force user to have some
predefined API. The problem is that all of those API differ.
</p>
<p>
To be more usable Boost.DLL does not force API. It's up to user to design
suitable API.
</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_dll.design_rationale.performance_and_memory_allocations"></a><a class="link" href="design_rationale.html#boost_dll.design_rationale.performance_and_memory_allocations" title="Performance and memory allocations">Performance
and memory allocations</a>
</h3></div></div></div>
<p>
Some methods of the library use <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">filesystem</span><span class="special">::</span><span class="identifier">path</span></code>
or return <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;</span></code>. This may look non optimal at first,
but there is a reason to do so.
</p>
<p>
<code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">filesystem</span><span class="special">::</span><span class="identifier">path</span></code> allows to transparently use Unicode
strings with non-Unicode ones. Using it provides a more user-friendly interface
for the library while the performance overhead is not noticeable because
of a slow file system operations that occur in <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">filesystem</span><span class="special">::</span><span class="identifier">path</span></code>
accepting methods.
</p>
<p>
<code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;</span></code> variables are returned by the <code class="computeroutput"><span class="identifier">library_info</span></code> methods. Querying a library
is a slow procedure anyway: it randomly reads parts of file from disc and
executes algorithms that sometimes have linear complexity from sections or
exported symbols count. Returning <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;</span></code> simplifies implementation and does not
require from user to keep an instance of <code class="computeroutput"><span class="identifier">library_info</span></code>
after query. Having not a very noticeable performance overhead in rarely
called methods seems reasonable.
</p>
<p>
Other methods are assumed to be hot paths and optimized as much as possible.
</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_dll.design_rationale.self_loading"></a><a class="link" href="design_rationale.html#boost_dll.design_rationale.self_loading" title="Self loading">Self loading</a>
</h3></div></div></div>
<p>
There is a good big reason to make self loading via <code class="computeroutput"><span class="identifier">shared_library</span><span class="special">(</span><span class="identifier">program_location</span><span class="special">())</span></code> instead of having some <code class="computeroutput"><span class="identifier">shared_library</span><span class="special">::</span><span class="identifier">load_self</span><span class="special">()</span></code> member method. That reason is the requirement
to have an ability to call <code class="computeroutput"><span class="identifier">shared_library</span><span class="special">(</span><span class="identifier">this_line_location</span><span class="special">())</span></code> from any place, even from the main binary.
We need that to link plugins into the binary and to create a transparent
reference counting mechanism.
</p>
<p>
Making multiple interfaces that do exactly the same things looks unreasonable
to me, that's why <code class="computeroutput"><span class="identifier">shared_library</span><span class="special">(</span><span class="identifier">program_location</span><span class="special">())</span></code> and <code class="computeroutput"><span class="identifier">shared_library</span><span class="special">(</span><span class="identifier">this_line_location</span><span class="special">())</span></code> are used without <code class="computeroutput"><span class="identifier">shared_library</span><span class="special">::</span><span class="identifier">load_self</span><span class="special">()</span></code>.
</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_dll.design_rationale.aliases_vs_mangling"></a><a class="link" href="design_rationale.html#boost_dll.design_rationale.aliases_vs_mangling" title="Aliases vs Mangling">Aliases
vs Mangling</a>
</h3></div></div></div>
<p>
Mangling depends on source code, for example <code class="computeroutput"><span class="string">"boost::foo"</span></code>
could be <code class="computeroutput"><span class="identifier">foo</span></code> function or
<code class="computeroutput"><span class="identifier">foo</span></code> variable. Depending on
that knowledge it must be mangled in different ways. More problems arise
if <code class="computeroutput"><span class="identifier">foo</span></code> is an overloaded function
that accepts parameters: <code class="computeroutput"><span class="string">"boost::foo(variant&lt;int,
short&gt;)"</span></code>. In that case full name of parameter must
be specified, which could be <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">variant</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span>
<span class="keyword">short</span><span class="special">&gt;</span></code>
or <code class="computeroutput"><span class="identifier">variant</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">short</span><span class="special">,</span> <span class="identifier">void_</span><span class="special">,</span> <span class="identifier">void_</span><span class="special">&gt;</span></code> ...
</p>
<p>
There was an idea to allow user to forward declare function and generate
mangled name from it:
</p>
<p>
</p>
<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">void</span> <span class="identifier">foo</span><span class="special">(</span><span class="identifier">variant</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">short</span><span class="special">&gt;);</span> <span class="special">}</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">mangled_name</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">dll</span><span class="special">::</span><span class="identifier">magic_mangle</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">foo</span><span class="special">);</span>
</pre>
<p>
</p>
<p>
But that idea has epic failed because of linker problems and no reliable
way to get mangled symbol name from compiler internals at compile time.
</p>
<p>
That's why aliases were considered a lesser evil:
</p>
<p>
</p>
<pre class="programlisting"><span class="identifier">BOOST_DLL_ALIAS</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">foo</span><span class="special">,</span> <span class="identifier">foo_variant</span><span class="special">)</span> <span class="comment">// in plugin</span>
<span class="string">"foo_variant"</span> <span class="comment">// in plugin importer</span>
</pre>
<p>
</p>
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright © 2014 Renato Tegon Forti, Antony Polukhin<br>Copyright © 2015 Antony Polukhin<br>Copyright © 2016 Antony Polukhin, Klemens Morgenstern<br>Copyright © 2017-2021 Antony Polukhin<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="f_a_q_.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../boost_dll.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="dependencies.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,213 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>F.A.Q.</title>
<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
<link rel="up" href="../boost_dll.html" title="Chapter 14. Boost.DLL">
<link rel="prev" href="limitations.html" title="Limitations">
<link rel="next" href="design_rationale.html" title="Design Rationale">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
<td align="center"><a href="../../../index.html">Home</a></td>
<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="limitations.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../boost_dll.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="design_rationale.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="boost_dll.f_a_q_"></a><a class="link" href="f_a_q_.html" title="F.A.Q.">F.A.Q.</a>
</h2></div></div></div>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
<span class="bold"><strong>Question:</strong></span> Is Boost.DLL thread-safe?
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: circle; "><li class="listitem">
<span class="bold"><strong>Answer:</strong></span> Some platforms allow concurrent
calls to <code class="computeroutput"><span class="identifier">dlopen</span></code> like
functions. For those platforms Boost.DLL is safe in the manner as
all the C++ Standard Library containers are: it is safe to use different
instances of shared_library from different threads even if all the
instances loaded the same library. On other platforms it is not safe
to concurrently call any of the functions from Boost.DLL (even a
<code class="computeroutput"><span class="identifier">shared_library</span><span class="special">::</span><span class="identifier">location</span><span class="special">()</span></code>
call triggers a race condition). See <a class="link" href="limitations.html#boost_dll.limitations.multithread" title="Thread safe library loading (Fails on FreeBSD, MacOS, iOS and some other)">Limitations,
Thread safe library loading</a>.
</li></ul></div>
</li></ul></div>
<pre class="programlisting"></pre>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
<span class="bold"><strong>Question:</strong></span> Why on Linux symbols from one
plugin are seen in another? Can't get symbol with same name from right
plugin!
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: circle; "><li class="listitem">
<span class="bold"><strong>Answer:</strong></span> You've run into the symbol
shadowing problem. Compile your plugins with "-fvisibility=hidden"
flag and take a look to the Tutorial section.
</li></ul></div>
</li></ul></div>
<pre class="programlisting"></pre>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
<span class="bold"><strong>Question:</strong></span> How Unicode (Windows) is handled?
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: circle; "><li class="listitem">
<span class="bold"><strong>Answer:</strong></span> Boost.DLL supports Unicode,
so that you could provide Unicode paths to it.
</li></ul></div>
</li></ul></div>
<pre class="programlisting"></pre>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
<span class="bold"><strong>Question:</strong></span> Can I open an executable file?
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: circle; "><li class="listitem">
<span class="bold"><strong>Answer:</strong></span> Yes, you can. Symbols need
be exported using in the executable using <code class="computeroutput"><span class="identifier">BOOST_SYMBOL_EXPORT</span></code>
or <code class="computeroutput"><span class="identifier">BOOST_DLL_ALIAS</span></code>.
You can call <code class="computeroutput"><span class="identifier">shared_library</span><span class="special">(</span><span class="identifier">program_location</span><span class="special">())</span></code> to load yourself. Refer to the
Tutorial section for more info. You can also query executables, just
provide a path to the executable to <code class="computeroutput"><span class="identifier">library_info</span></code>
class.
</li></ul></div>
</li></ul></div>
<pre class="programlisting"></pre>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
<span class="bold"><strong>Question:</strong></span> What if I specify wrong type
in <code class="computeroutput"><span class="identifier">shared_library</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>
or <code class="computeroutput"><span class="identifier">import</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span></code>?
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: circle; "><li class="listitem">
<span class="bold"><strong>Answer:</strong></span> Usually you'll end up with
<code class="computeroutput"><span class="identifier">Segmentation</span> <span class="identifier">Fault</span></code>.
However it is safe to make types more strict, for example making
<code class="computeroutput"><span class="keyword">const</span> <span class="keyword">int</span></code>
from an <code class="computeroutput"><span class="keyword">int</span></code> will not
harm.
</li></ul></div>
</li></ul></div>
<pre class="programlisting"></pre>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
<span class="bold"><strong>Question:</strong></span> Does your library guarantee
ABI stability of methods?
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: circle; "><li class="listitem">
<span class="bold"><strong>Answer:</strong></span> Library only guarantees
that alias names created using the <code class="computeroutput"><span class="identifier">BOOST_DLL_ALIAS</span></code>
macros will not change with the change of compiler or platform. You
must take care of functions ABI and API stability by your own.
</li></ul></div>
</li></ul></div>
<pre class="programlisting"></pre>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
<span class="bold"><strong>Question:</strong></span> Are there any function signature
restrictions for the exported/imported functions?
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: circle; "><li class="listitem">
<span class="bold"><strong>Answer:</strong></span> No. You may import/export
functions with any signature and any return parameter.
</li></ul></div>
</li></ul></div>
<pre class="programlisting"></pre>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
<span class="bold"><strong>Question:</strong></span> I have 2 plugins that use same
shared library. Would be the shared library loaded twice?
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: circle; "><li class="listitem">
<span class="bold"><strong>Answer:</strong></span> No. Pugins will share the
shared library instance.
</li></ul></div>
</li></ul></div>
<pre class="programlisting"></pre>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
<span class="bold"><strong>Question:</strong></span> I have 2 plugins each of them
must work with it's own version of <code class="computeroutput"><span class="identifier">libsome_library</span></code>
shared library. How to achieve that?
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: circle; "><li class="listitem">
<span class="bold"><strong>Answer:</strong></span> Avoid such situations by
statically linking in the libsome_library into each plugin and loading
plugins with <code class="computeroutput"><span class="identifier">load_mode</span><span class="special">::</span><span class="identifier">rtld_deepbind</span></code>.
</li></ul></div>
</li></ul></div>
<pre class="programlisting"></pre>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
<span class="bold"><strong>Question:</strong></span> How to load a shared object
from memory??
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: circle; "><li class="listitem">
<span class="bold"><strong>Answer:</strong></span> All existing OS avoid loading
shared libraries directly from userspace memory, so you'll find no
syscall for such case. Currently Boost.DLL provides no means for
honest loading shared objects from memory. This requires reimplementing
dynamic linker logic in userspace for all the platforms, which is
a huge amount of work and very error-prone. However working patches
are welcomed!
</li></ul></div>
</li></ul></div>
<p>
Workaround would be to write plugin into a temporary file in RAM and load plugin
from it:
</p>
<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">filesystem</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">dll</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">;</span>
<span class="identifier">dll</span><span class="special">:</span><span class="identifier">shared_library</span> <span class="identifier">load_from_memory</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">data</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">filesystem</span><span class="special">::</span><span class="identifier">path</span><span class="special">&amp;</span> <span class="identifier">tmp_plugin_path</span> <span class="special">=</span> <span class="identifier">filesystem</span><span class="special">::</span><span class="identifier">unique_path</span><span class="special">()</span> <span class="special">/</span> <span class="string">"libplugin.so"</span><span class="special">)</span> <span class="special">{</span>
<span class="keyword">const</span> <span class="identifier">filesystem</span><span class="special">::</span><span class="identifier">path</span> <span class="identifier">plugin_location</span> <span class="special">=</span> <span class="identifier">filesystem</span><span class="special">::</span><span class="identifier">temp_directory_path</span><span class="special">()</span> <span class="special">/</span> <span class="identifier">tmp_plugin_path</span><span class="special">;</span>
<span class="identifier">filesystem</span><span class="special">::</span><span class="identifier">create_directories</span><span class="special">(</span><span class="identifier">plugin_location</span><span class="special">.</span><span class="identifier">parent_path</span><span class="special">());</span>
<span class="identifier">filesystem</span><span class="special">::</span><span class="identifier">ofstream</span> <span class="identifier">ofs</span><span class="special">(</span><span class="identifier">plugin_location</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">ios</span><span class="special">::</span><span class="identifier">out</span><span class="special">|</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">ios</span><span class="special">::</span><span class="identifier">bin</span><span class="special">|</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">ios</span><span class="special">::</span><span class="identifier">trunc</span><span class="special">);</span>
<span class="identifier">ofs</span><span class="special">.</span><span class="identifier">write</span><span class="special">(</span><span class="identifier">data</span><span class="special">,</span> <span class="identifier">size</span><span class="special">);</span>
<span class="keyword">return</span> <span class="identifier">dll</span><span class="special">::</span><span class="identifier">shared_library</span><span class="special">(</span><span class="identifier">plugin_location</span><span class="special">);</span>
<span class="special">}</span>
</pre>
<p>
</p>
<p>
But there's no guarantee that <code class="computeroutput"><span class="identifier">filesystem</span><span class="special">::</span><span class="identifier">temp_directory_path</span><span class="special">()</span></code> will actually write to RAM, that's very platform
dependent.
</p>
<pre class="programlisting"></pre>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
<span class="bold"><strong>Question:</strong></span> Can I use function pointer type
(like <code class="computeroutput"><span class="keyword">void</span><span class="special">(*)()</span></code>)
instead of function type (like <code class="computeroutput"><span class="keyword">void</span><span class="special">()</span></code>) to import function?
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: circle; "><li class="listitem">
<span class="bold"><strong>Answer:</strong></span> No you can't because the
meaning of importing a function pointer is different:
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: square; ">
<li class="listitem">
<code class="computeroutput"><span class="identifier">lib</span><span class="special">.</span><span class="identifier">get</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">()&gt;(</span><span class="string">"func"</span><span class="special">)</span></code>
imports a function <code class="computeroutput"><span class="keyword">void</span>
<span class="identifier">func</span><span class="special">()</span></code>
</li>
<li class="listitem">
<code class="computeroutput"><span class="identifier">lib</span><span class="special">.</span><span class="identifier">get</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">(*)()&gt;(</span><span class="string">"func_var"</span><span class="special">)</span></code>
imports a variable that stores a pointer to the function <code class="computeroutput"><span class="keyword">auto</span> <span class="identifier">func_var</span>
<span class="special">=</span> <span class="special">&amp;</span><span class="identifier">func</span></code>
</li>
</ul></div>
</li></ul></div>
</li></ul></div>
<pre class="programlisting"></pre>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
<span class="bold"><strong>Question:</strong></span> I have found a bug, how do I
notify?
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: circle; "><li class="listitem">
<span class="bold"><strong>Answer:</strong></span> Create an <a href="https://github.com/apolukhin/Boost.DLL/issues" target="_top">issue
at GitHub</a> with a detailed description.
</li></ul></div>
</li></ul></div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright © 2014 Renato Tegon Forti, Antony Polukhin<br>Copyright © 2015 Antony Polukhin<br>Copyright © 2016 Antony Polukhin, Klemens Morgenstern<br>Copyright © 2017-2021 Antony Polukhin<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="limitations.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../boost_dll.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="design_rationale.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,227 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Getting started</title>
<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
<link rel="up" href="../boost_dll.html" title="Chapter 14. Boost.DLL">
<link rel="prev" href="../boost_dll.html" title="Chapter 14. Boost.DLL">
<link rel="next" href="tutorial.html" title="Tutorial">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
<td align="center"><a href="../../../index.html">Home</a></td>
<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="../boost_dll.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../boost_dll.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="tutorial.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="boost_dll.getting_started"></a><a class="link" href="getting_started.html" title="Getting started">Getting started</a>
</h2></div></div></div>
<p>
Boost.DLL is a header only library. To start with the library you only need
to include <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">dll</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code> header.
After that you are free to import and export functions and variables. Importing
code requires linking with <code class="computeroutput"><span class="identifier">boost_filesystem</span></code>
and <code class="computeroutput"><span class="identifier">boost_system</span></code> libraries.
</p>
<p>
If you want to load a library, just construct <code class="computeroutput"><a class="link" href="../boost/dll/shared_library.html" title="Class shared_library">boost::dll::shared_library</a></code>
class with a path to the library as a parameter:
</p>
<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">dll</span><span class="special">::</span><span class="identifier">shared_library</span> <span class="identifier">lib</span><span class="special">(</span><span class="string">"/test/boost/application/libtest_library.so"</span><span class="special">);</span>
</pre>
<p>
Now you can easily import symbols from that library using the <code class="computeroutput"><span class="identifier">get</span></code> and <code class="computeroutput"><span class="identifier">get_alias</span></code>
member functions:
</p>
<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">plugin_constant</span> <span class="special">=</span> <span class="identifier">lib</span><span class="special">.</span><span class="identifier">get</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="keyword">int</span><span class="special">&gt;(</span><span class="string">"integer_variable"</span><span class="special">);</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">function</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">()&gt;</span> <span class="identifier">f</span> <span class="special">=</span> <span class="identifier">lib</span><span class="special">.</span><span class="identifier">get</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">()&gt;(</span><span class="string">"function_returning_int"</span><span class="special">);</span>
<span class="keyword">int</span><span class="special">&amp;</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">lib</span><span class="special">.</span><span class="identifier">get_alias</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="string">"alias_to_int_variable"</span><span class="special">);</span>
</pre>
<p>
In case of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">dll</span><span class="special">::</span><span class="identifier">shared_library</span></code>
it is safe to use imported symbols only until <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">dll</span><span class="special">::</span><span class="identifier">shared_library</span></code> instance is not destroyed.
</p>
<p>
Query libraries using <code class="computeroutput"><a class="link" href="../boost/dll/library_info.html" title="Class library_info">boost::dll::library_info</a></code>
and get symbol infos using <code class="computeroutput"><a class="link" href="../boost/dll/symbol_location.html" title="Function symbol_location">boost::dll::symbol_location</a></code>,
<code class="computeroutput"><a class="link" href="../boost/dll/this_line_location.html" title="Function this_line_location">boost::dll::this_line_location</a></code>
and <code class="computeroutput"><a class="link" href="../boost/dll/program_location.html" title="Function program_location">boost::dll::program_location</a></code>.
</p>
<p>
For importing a single function or variable you may use a following one liners:
</p>
<p>
</p>
<pre class="programlisting"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">;</span>
<span class="comment">// `extern "C"` - specifies C linkage: forces the compiler to export function/variable by a pretty (unmangled) C name.</span>
<span class="preprocessor">#define</span> <span class="identifier">API</span> <span class="keyword">extern</span> <span class="string">"C"</span> <span class="identifier">BOOST_SYMBOL_EXPORT</span>
</pre>
<p>
</p>
<div class="informaltable">
<a name="boost_dll.getting_started.starting"></a><table class="table">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
Import (code that uses DLL/DSL):
</p>
</th>
<th>
<p>
Export (DLL/DSL sources):
</p>
</th>
<th>
<p>
Functions description:
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
</p>
<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="comment">// Importing function.</span>
<span class="keyword">auto</span> <span class="identifier">cpp11_func</span> <span class="special">=</span> <span class="identifier">dll</span><span class="special">::</span><span class="identifier">import_symbol</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&amp;&amp;)&gt;(</span>
<span class="identifier">path_to_shared_library</span><span class="special">,</span> <span class="string">"i_am_a_cpp11_function"</span>
<span class="special">);</span>
</pre>
<p>
</p>
</td>
<td>
<p>
</p>
<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="keyword">namespace</span> <span class="identifier">some_namespace</span> <span class="special">{</span>
<span class="identifier">API</span> <span class="keyword">int</span> <span class="identifier">i_am_a_cpp11_function</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&amp;&amp;</span> <span class="identifier">param</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="comment">// ^-------------------- function name to use in dll::import_symbol&lt;&gt;</span>
<span class="special">}</span>
</pre>
<p>
</p>
</td>
<td>
<p>
<code class="computeroutput">import&lt;T&gt;(...)</code>
</p>
</td>
</tr>
<tr>
<td>
<p>
</p>
<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="comment">// Importing variable.</span>
<span class="identifier">shared_ptr</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;</span> <span class="identifier">cpp_var</span> <span class="special">=</span> <span class="identifier">dll</span><span class="special">::</span><span class="identifier">import_symbol</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;(</span>
<span class="identifier">path_to_shared_library</span><span class="special">,</span> <span class="string">"cpp_variable_name"</span>
<span class="special">);</span>
</pre>
<p>
</p>
</td>
<td>
<p>
</p>
<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="keyword">namespace</span> <span class="identifier">your_project_namespace</span> <span class="special">{</span>
<span class="identifier">API</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">cpp_variable_name</span><span class="special">;</span>
<span class="special">}</span>
</pre>
<p>
</p>
</td>
<td>
<p>
<code class="computeroutput">import&lt;T&gt;(...)</code>
</p>
</td>
</tr>
<tr>
<td>
<p>
</p>
<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="comment">// Importing function by alias name</span>
<span class="keyword">auto</span> <span class="identifier">cpp_func</span> <span class="special">=</span> <span class="identifier">dll</span><span class="special">::</span><span class="identifier">import_alias</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&amp;)&gt;(</span>
<span class="identifier">path_to_shared_library</span><span class="special">,</span> <span class="string">"pretty_name"</span>
<span class="special">);</span>
</pre>
<p>
</p>
</td>
<td>
<p>
</p>
<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="keyword">namespace</span> <span class="identifier">some_namespace</span> <span class="special">{</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">i_am_function_with_ugly_name</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&amp;</span> <span class="identifier">param</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="special">}</span>
<span class="comment">// When you have no control over function sources or wish to specify another name.</span>
<span class="identifier">BOOST_DLL_ALIAS</span><span class="special">(</span><span class="identifier">some_namespace</span><span class="special">::</span><span class="identifier">i_am_function_with_ugly_name</span><span class="special">,</span> <span class="identifier">pretty_name</span><span class="special">)</span>
</pre>
<p>
</p>
</td>
<td>
<p>
<code class="computeroutput"><a class="link" href="../boost/dll/import_alias.html" title="Function import_alias">import_alias&lt;T&gt;(...)</a></code>
</p>
<p>
<code class="computeroutput"><a class="link" href="../BOOST_DLL_ALIAS.html" title="Macro BOOST_DLL_ALIAS">BOOST_DLL_ALIAS</a></code>
</p>
</td>
</tr>
</tbody>
</table>
</div>
<p>
It is safe to use imported variable or function because the variables returned
from <code class="computeroutput">import&lt;T&gt;(...)</code>
and <code class="computeroutput"><a class="link" href="../boost/dll/import_alias.html" title="Function import_alias">import_alias&lt;T&gt;(...)</a></code>
functions internally hold a reference to the shared library.
</p>
<p>
<code class="computeroutput">BOOST_SYMBOL_EXPORT</code> is just
a macro from Boost.Config that expands into the <code class="computeroutput"><span class="identifier">__declspec</span><span class="special">(</span><span class="identifier">dllexport</span><span class="special">)</span></code> or <code class="computeroutput"><span class="identifier">__attribute__</span><span class="special">((</span><span class="identifier">visibility</span><span class="special">(</span><span class="string">"default"</span><span class="special">)))</span></code>. You are free to use your own macro for
exports.
</p>
<div class="note"><table border="0" summary="Note">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
<th align="left">Note</th>
</tr>
<tr><td align="left" valign="top"><p>
On Linux/POSIX/MacOS link with library "dl". "-fvisibility=hidden"
flag is also recommended.
</p></td></tr>
</table></div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright © 2014 Renato Tegon Forti, Antony Polukhin<br>Copyright © 2015 Antony Polukhin<br>Copyright © 2016 Antony Polukhin, Klemens Morgenstern<br>Copyright © 2017-2021 Antony Polukhin<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="../boost_dll.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../boost_dll.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="tutorial.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,133 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Limitations</title>
<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
<link rel="up" href="../boost_dll.html" title="Chapter 14. Boost.DLL">
<link rel="prev" href="../boost/dll/experimental/import_mangled.html" title="Function import_mangled">
<link rel="next" href="f_a_q_.html" title="F.A.Q.">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
<td align="center"><a href="../../../index.html">Home</a></td>
<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="../boost/dll/experimental/import_mangled.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../boost_dll.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="f_a_q_.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="boost_dll.limitations"></a><a class="link" href="limitations.html" title="Limitations">Limitations</a>
</h2></div></div></div>
<div class="toc"><dl class="toc">
<dt><span class="section"><a href="limitations.html#boost_dll.limitations.exporting_weak_symbols__fails_on_mingw__android_">Exporting
weak symbols (Fails on MinGW, Android)</a></span></dt>
<dt><span class="section"><a href="limitations.html#boost_dll.limitations.user_defined_section_names__fails_on_sunos___oracle_solaris_studio_compilers_">User
defined section names (Fails on SunOS + Oracle Solaris Studio Compilers)</a></span></dt>
<dt><span class="section"><a href="limitations.html#boost_dll.limitations.multithread">Thread safe library
loading (Fails on FreeBSD, MacOS, iOS and some other)</a></span></dt>
<dt><span class="section"><a href="limitations.html#boost_dll.limitations.nested">Nested Function Definitions</a></span></dt>
</dl></div>
<p>
Some platforms and compilers do not provide all the required functionality
to have a fully functional Boost.DLL. Such compilers are mentioned in this
section along with possible workarounds for those limitations.
</p>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_dll.limitations.exporting_weak_symbols__fails_on_mingw__android_"></a><a class="link" href="limitations.html#boost_dll.limitations.exporting_weak_symbols__fails_on_mingw__android_" title="Exporting weak symbols (Fails on MinGW, Android)">Exporting
weak symbols (Fails on MinGW, Android)</a>
</h3></div></div></div>
<p>
Some versions of Android, <code class="computeroutput"><span class="identifier">MinGW</span></code>
and <code class="computeroutput"><span class="identifier">ld</span></code> on Windows platform
fail to mix <code class="computeroutput"><span class="identifier">__dllexport__</span></code>
and <code class="computeroutput"><span class="identifier">weak</span></code> attributes. This
leads us to situation, where we must explicitly specify translation unit
in which <code class="computeroutput"><a class="link" href="../BOOST_DLL_ALIAS.html" title="Macro BOOST_DLL_ALIAS">BOOST_DLL_ALIAS</a></code> is
instantiated, making all other <code class="computeroutput"><a class="link" href="../BOOST_DLL_ALIAS.html" title="Macro BOOST_DLL_ALIAS">BOOST_DLL_ALIAS</a></code>
declarations with that alias name an <code class="computeroutput"><span class="keyword">extern</span></code>
variable.
</p>
<p>
Unit that must hold an instance of <code class="computeroutput"><a class="link" href="../BOOST_DLL_ALIAS.html" title="Macro BOOST_DLL_ALIAS">BOOST_DLL_ALIAS</a></code>
must define <code class="computeroutput"><a class="link" href="../BOOST_DL_idm45601578452480.html" title="Macro BOOST_DLL_FORCE_ALIAS_INSTANTIATION">BOOST_DLL_FORCE_ALIAS_INSTANTIATION</a></code>
before including any of the Boost.DLL library headers.
</p>
<p>
You may explicitly disable export of weak symbols using <code class="computeroutput"><a class="link" href="../BOOST_DL_idm45601578450672.html" title="Macro BOOST_DLL_FORCE_NO_WEAK_EXPORTS">BOOST_DLL_FORCE_NO_WEAK_EXPORTS</a></code>.
This may be useful for working around linker problems or to test your program
for compatibility with linkers that do not support exporting weak symbols.
</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_dll.limitations.user_defined_section_names__fails_on_sunos___oracle_solaris_studio_compilers_"></a><a class="link" href="limitations.html#boost_dll.limitations.user_defined_section_names__fails_on_sunos___oracle_solaris_studio_compilers_" title="User defined section names (Fails on SunOS + Oracle Solaris Studio Compilers)">User
defined section names (Fails on SunOS + Oracle Solaris Studio Compilers)</a>
</h3></div></div></div>
<p>
Some platforms ignore section attributes, so that querying for a symbols
in a specified section using <code class="computeroutput"><a class="link" href="../boost/dll/library_info.html" title="Class library_info">boost::dll::library_info</a></code>
may return nothing.
</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_dll.limitations.multithread"></a><a class="link" href="limitations.html#boost_dll.limitations.multithread" title="Thread safe library loading (Fails on FreeBSD, MacOS, iOS and some other)">Thread safe library
loading (Fails on FreeBSD, MacOS, iOS and some other)</a>
</h3></div></div></div>
<p>
On some platforms <code class="computeroutput"><span class="identifier">dlopen</span></code>,<code class="computeroutput"><span class="identifier">dlclose</span></code> and some other functions assume
that they won't be called concurrently.
</p>
<p>
Platforms that certaly have that issue are FreeBSD, MacOS, iOS.
</p>
<p>
Platforms that certaly do not have such issue are Windows, Linux+glibc, Android,
QNX.
</p>
<p>
Other platforms are under question. If you're using one of the platforms
that are not listed (for example Linux+busybox), you may run the <code class="computeroutput"><span class="identifier">shared_library_concurrent_load_test</span></code> test
to detect the issue:
</p>
<pre class="programlisting"><span class="identifier">cd</span> <span class="identifier">boost_folder</span><span class="special">/</span><span class="identifier">libs</span><span class="special">/</span><span class="identifier">dll</span><span class="special">/</span><span class="identifier">test</span>
<span class="special">../../../</span><span class="identifier">b2</span> <span class="special">-</span><span class="identifier">a</span> <span class="identifier">shared_library_concurrent_load_test</span>
</pre>
<p>
</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_dll.limitations.nested"></a><a class="link" href="limitations.html#boost_dll.limitations.nested" title="Nested Function Definitions">Nested Function Definitions</a>
</h3></div></div></div>
<p>
If a function is defined inside the class-definition it may be interpreted
as always-inline which can lead to the function not being exported at all.
This does however differ between between compilers.
</p>
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright © 2014 Renato Tegon Forti, Antony Polukhin<br>Copyright © 2015 Antony Polukhin<br>Copyright © 2016 Antony Polukhin, Klemens Morgenstern<br>Copyright © 2017-2021 Antony Polukhin<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="../boost/dll/experimental/import_mangled.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../boost_dll.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="f_a_q_.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,420 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Mangled Import</title>
<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
<link rel="up" href="../boost_dll.html" title="Chapter 14. Boost.DLL">
<link rel="prev" href="tutorial.html" title="Tutorial">
<link rel="next" href="missuses.html" title="Missuses">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
<td align="center"><a href="../../../index.html">Home</a></td>
<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="tutorial.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../boost_dll.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="missuses.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="boost_dll.mangled_import"></a><a class="link" href="mangled_import.html" title="Mangled Import">Mangled Import</a>
</h2></div></div></div>
<div class="toc"><dl class="toc">
<dt><span class="section"><a href="mangled_import.html#boost_dll.mangled_import.support___requirements">Support
&amp; Requirements</a></span></dt>
<dt><span class="section"><a href="mangled_import.html#boost_dll.mangled_import.mangled_import_example">Mangled
Import Example</a></span></dt>
<dt><span class="section"><a href="mangled_import.html#boost_dll.mangled_import.class_import">Class Import</a></span></dt>
<dt><span class="section"><a href="mangled_import.html#boost_dll.mangled_import.overloading_qualifiers">Overloading
qualifiers</a></span></dt>
</dl></div>
<p>
This section describes the experimental feature of allowing the import of mangled
symbols from an dll. While this feature is unique to this library and looks
quite promising, it is not throroughly tested and thus not considered stable.
</p>
<p>
As a short example we can import the following functions quite easily:
</p>
<p>
</p>
<pre class="programlisting"><span class="comment">//library.dll</span>
<span class="keyword">namespace</span> <span class="identifier">foo</span> <span class="special">{</span>
<span class="keyword">int</span> <span class="identifier">bar</span><span class="special">(</span><span class="keyword">int</span><span class="special">);</span>
<span class="keyword">double</span> <span class="identifier">bar</span><span class="special">(</span><span class="keyword">double</span><span class="special">);</span>
<span class="special">}</span>
</pre>
<p>
</p>
<p>
And the import looks like this:
</p>
<p>
</p>
<pre class="programlisting"><span class="keyword">auto</span> <span class="identifier">f1</span> <span class="special">=</span> <span class="identifier">import_mangled</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">(</span><span class="keyword">int</span><span class="special">)&gt;(</span><span class="string">"library.dll"</span><span class="special">,</span> <span class="string">"foo::bar"</span><span class="special">);</span>
<span class="keyword">auto</span> <span class="identifier">f2</span> <span class="special">=</span> <span class="identifier">import_mangled</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">(</span><span class="keyword">double</span><span class="special">)&gt;(</span><span class="string">"library.dll"</span><span class="special">,</span> <span class="string">"foo::bar"</span><span class="special">);</span>
<span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">f1</span><span class="special">(</span><span class="number">42</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span>
<span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">f2</span><span class="special">(</span><span class="number">3.2</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span>
</pre>
<p>
</p>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_dll.mangled_import.support___requirements"></a><a class="link" href="mangled_import.html#boost_dll.mangled_import.support___requirements" title="Support &amp; Requirements">Support
&amp; Requirements</a>
</h3></div></div></div>
<p>
Currently, the Itanium ABI and the MSVC ABI are implemented. The MSVC ABI
requires boost.spirit.x3 support, allowing only the usage of MSVC 2015. The
Itanium API requires C++11.
</p>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">
Gcc
</li>
<li class="listitem">
Clang
</li>
<li class="listitem">
MSVC 2015
</li>
<li class="listitem">
Intel C++
</li>
</ul></div>
<p>
The Itanium API does not import the return type of functions, nor the type
of global variables.
</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_dll.mangled_import.mangled_import_example"></a><a class="link" href="mangled_import.html#boost_dll.mangled_import.mangled_import_example" title="Mangled Import Example">Mangled
Import Example</a>
</h3></div></div></div>
<p>
The core of the mangled import is the <code class="computeroutput">smart_library</code>
class. It can import functions and variables in their mangled form; to do
this, the smart_library reads the entire outline of the library and demangles
every entry point in it. That also means, that this class should only be
constructed once.
</p>
<p>
In order to import all the methods in the following library, we will use
the <code class="computeroutput">smart_library</code> .
</p>
<p>
The first thing to do when creating your own plugins is define the plugin
interface. There is an example of an abstract class that will be our plugin
API:
</p>
<p>
</p>
<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">string</span><span class="special">&gt;</span>
<span class="keyword">namespace</span> <span class="identifier">space</span> <span class="special">{</span>
<span class="keyword">class</span> <span class="identifier">BOOST_SYMBOL_EXPORT</span> <span class="identifier">my_plugin</span>
<span class="special">{</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">_name</span><span class="special">;</span>
<span class="keyword">public</span><span class="special">:</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">name</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
<span class="keyword">float</span> <span class="identifier">calculate</span><span class="special">(</span><span class="keyword">float</span> <span class="identifier">x</span><span class="special">,</span> <span class="keyword">float</span> <span class="identifier">y</span><span class="special">);</span>
<span class="keyword">int</span> <span class="identifier">calculate</span><span class="special">(</span><span class="keyword">int</span><span class="special">,</span> <span class="identifier">x</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">y</span><span class="special">);</span>
<span class="keyword">static</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">();</span>
<span class="identifier">my_plugin</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&amp;</span> <span class="identifier">name</span><span class="special">);</span>
<span class="identifier">my_plugin</span><span class="special">();</span>
<span class="special">~</span><span class="identifier">my_plugin_api</span><span class="special">();</span>
<span class="keyword">static</span> <span class="keyword">int</span> <span class="identifier">value</span><span class="special">;</span>
<span class="special">};</span>
<span class="special">}</span>
</pre>
<p>
</p>
<p>
Alright, now we have the definition for the plugin, so we use it in the following
full-fleshed example. Mind that there is a more convenient solution to import
member-functions which will be discussed later on. This example shows however
what the <code class="computeroutput">smart_lib</code> provides as features.
</p>
<p>
At first we setup the smart library. Mind that the alias class is needed
to provide a type-alias for the my_plugin.
</p>
<p>
</p>
<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">dll</span><span class="special">/</span><span class="identifier">smart_library</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span> <span class="comment">// for import_alias</span>
<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">memory</span><span class="special">&gt;</span>
<span class="keyword">namespace</span> <span class="identifier">dll</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">dll</span><span class="special">;</span>
<span class="keyword">struct</span> <span class="identifier">alias</span><span class="special">;</span>
<span class="keyword">int</span> <span class="identifier">main</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">argc</span><span class="special">,</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">argv</span><span class="special">[])</span> <span class="special">{</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">dll</span><span class="special">::</span><span class="identifier">fs</span><span class="special">::</span><span class="identifier">path</span> <span class="identifier">lib_path</span><span class="special">(</span><span class="identifier">argv</span><span class="special">[</span><span class="number">1</span><span class="special">]);</span> <span class="comment">// argv[1] contains path to directory with our plugin library</span>
<span class="identifier">dll</span><span class="special">::</span><span class="identifier">smart_lib</span> <span class="identifier">lib</span><span class="special">(</span><span class="identifier">lib_path</span><span class="special">);</span> <span class="comment">// smart library instance</span>
</pre>
<p>
</p>
<p>
In order to create the class, we will need to allocate memory. That of course
means, that we need to know the size; unfortunately it is not exported into
the dll, so we added the static size function for export. Static are used
as plain functions.
</p>
<p>
So we import it, call it and allocate memory.
</p>
<p>
</p>
<pre class="programlisting"><span class="keyword">auto</span> <span class="identifier">size_f</span> <span class="special">=</span> <span class="identifier">lib</span><span class="special">.</span><span class="identifier">get_function</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">()&gt;(</span><span class="string">"space::my_plugin::size"</span><span class="special">);</span> <span class="comment">//get the size function</span>
<span class="keyword">auto</span> <span class="identifier">size</span> <span class="special">=</span> <span class="identifier">size_f</span><span class="special">();</span> <span class="comment">// get the size of the class</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">[],</span> <span class="identifier">size</span><span class="special">&gt;</span> <span class="identifier">buffer</span><span class="special">(</span><span class="keyword">new</span> <span class="keyword">char</span><span class="special">[</span><span class="identifier">size</span><span class="special">]);</span> <span class="comment">//allocate a buffer for the import</span>
<span class="identifier">alias</span> <span class="special">&amp;</span> <span class="identifier">inst</span> <span class="special">=</span> <span class="special">*</span><span class="keyword">reinterpret_cast</span><span class="special">&lt;</span><span class="identifier">alias</span><span class="special">*&gt;(</span><span class="identifier">buffer</span><span class="special">.</span><span class="identifier">get</span><span class="special">());</span> <span class="comment">//cast it to our alias type.</span>
</pre>
<p>
</p>
<p>
Now, we have the memory size and a reference with our alias type. In order
to use it, we need to register the type as an alias. That will allow the
smart library to resolve the type name.
</p>
<p>
</p>
<pre class="programlisting"><span class="identifier">lib</span><span class="special">.</span><span class="identifier">add_type_alias</span><span class="special">(</span><span class="string">"space::my_plugin"</span><span class="special">);</span> <span class="comment">//add an alias, so i can import a class that is not declared here</span>
</pre>
<p>
</p>
<p>
In order to use the class, we of course need to initialize it, i.e. call
the constructor. The Itanium ABI may also implement an allocating constructor.
That is why a constructor may have two functions; since we already have allocated
the memory we use the standard constructor version, of the constructor from
string. So we select the constructor by passing the signature.
</p>
<p>
</p>
<pre class="programlisting"><span class="keyword">auto</span> <span class="identifier">ctor</span> <span class="special">=</span> <span class="identifier">lib</span><span class="special">.</span><span class="identifier">get_constructor</span><span class="special">&lt;</span><span class="identifier">alias</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&amp;)&gt;();</span> <span class="comment">//get the constructor</span>
<span class="identifier">ctor</span><span class="special">.</span><span class="identifier">call_standard</span><span class="special">(&amp;</span><span class="identifier">inst</span><span class="special">,</span> <span class="string">"MyName"</span><span class="special">);</span> <span class="comment">//call the non-allocating constructor. The allocating-constructor is a non-portable feature</span>
</pre>
<p>
</p>
<p>
So since the class is now initialized, we can call the name method. If the
function is const and/or volatile the type parameter passed as type must
have the same qualifiers.
</p>
<p>
</p>
<pre class="programlisting"><span class="keyword">auto</span> <span class="identifier">name_f</span> <span class="special">=</span> <span class="identifier">lib</span><span class="special">.</span><span class="identifier">get_mem_fn</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="identifier">alias</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">()&gt;(</span><span class="string">"name"</span><span class="special">);//</span><span class="identifier">import</span> <span class="identifier">the</span> <span class="identifier">name</span> <span class="identifier">function</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"Name Call: "</span> <span class="special">&lt;&lt;</span> <span class="special">(</span><span class="identifier">inst</span><span class="special">.*</span><span class="identifier">name_f</span><span class="special">)()</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
</pre>
<p>
</p>
<p>
Overloaded functions can only be imported separately.
</p>
<p>
</p>
<pre class="programlisting"><span class="comment">//import both calculate functions</span>
<span class="keyword">auto</span> <span class="identifier">calc_f</span> <span class="special">=</span> <span class="identifier">lib</span><span class="special">.</span><span class="identifier">get_mem_fn</span><span class="special">&lt;</span><span class="identifier">alias</span><span class="special">,</span> <span class="keyword">float</span><span class="special">(</span><span class="keyword">float</span><span class="special">,</span> <span class="keyword">float</span><span class="special">)&gt;(</span><span class="string">"calculate"</span><span class="special">);</span>
<span class="keyword">auto</span> <span class="identifier">calc_i</span> <span class="special">=</span> <span class="identifier">lib</span><span class="special">.</span><span class="identifier">get_mem_fn</span><span class="special">&lt;</span><span class="identifier">alias</span><span class="special">,</span> <span class="keyword">int</span><span class="special">(</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">int</span><span class="special">)&gt;</span> <span class="special">(</span><span class="string">"calculate"</span><span class="special">);</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"calc(float): "</span> <span class="special">&lt;&lt;</span> <span class="special">(</span><span class="identifier">inst</span><span class="special">.*</span><span class="identifier">calc_f</span><span class="special">)(</span><span class="number">5.</span><span class="special">,</span> <span class="number">2.</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"calc(int) : "</span> <span class="special">&lt;&lt;</span> <span class="special">(</span><span class="identifier">inst</span><span class="special">.*</span><span class="identifier">calc_f</span><span class="special">)(</span><span class="number">5</span><span class="special">,</span> <span class="number">2</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
</pre>
<p>
</p>
<p>
Import of static variable is done like with plain variable.
</p>
<p>
</p>
<pre class="programlisting"><span class="keyword">auto</span> <span class="special">&amp;</span> <span class="identifier">var</span> <span class="special">=</span> <span class="identifier">lib</span><span class="special">.</span><span class="identifier">get_variable</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="string">"space::my_plugin::value"</span><span class="special">);</span>
<span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"value "</span> <span class="special">&lt;&lt;</span> <span class="identifier">var</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span>
</pre>
<p>
</p>
<p>
Since we are finished, we call the destructor of the class.
</p>
<p>
</p>
<pre class="programlisting"> <span class="keyword">auto</span> <span class="identifier">dtor</span> <span class="special">=</span> <span class="identifier">lib</span><span class="special">.</span><span class="identifier">get_destructor</span><span class="special">&lt;</span><span class="identifier">alias</span><span class="special">&gt;();</span> <span class="comment">//get the destructor</span>
<span class="identifier">dtor</span><span class="special">.</span><span class="identifier">call_standard</span><span class="special">(&amp;</span><span class="identifier">inst</span><span class="special">);</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"plugin-&gt;calculate(1.5, 1.5) call: "</span> <span class="special">&lt;&lt;</span> <span class="identifier">plugin</span><span class="special">-&gt;</span><span class="identifier">calculate</span><span class="special">(</span><span class="number">1.5</span><span class="special">,</span> <span class="number">1.5</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
<span class="special">}</span>
</pre>
<p>
</p>
<p>
<a class="link" href="mangled_import.html" title="Mangled Import">Back to the Top</a>
</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_dll.mangled_import.class_import"></a><a class="link" href="mangled_import.html#boost_dll.mangled_import.class_import" title="Class Import">Class Import</a>
</h3></div></div></div>
<p>
Now it is demonstrated, how mangled and methods may be imported. This is
however a rather versatile way, so an easier interface is provided, which
also allows access to the type_info of an object.
</p>
<p>
We will take the same class and import the same methods, but do it with the
import features.
</p>
<p>
We put the library into a shared_pointer, because every import will hold
such a pointer to it. That is, we do not want to copy it.
</p>
<p>
</p>
<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">dll</span><span class="special">/</span><span class="identifier">smart_library</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">dll</span><span class="special">/</span><span class="identifier">import_mangled</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">dll</span><span class="special">/</span><span class="identifier">import_class</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
<span class="keyword">int</span> <span class="identifier">main</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">argc</span><span class="special">,</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">argv</span><span class="special">[])</span> <span class="special">{</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">dll</span><span class="special">::</span><span class="identifier">fs</span><span class="special">::</span><span class="identifier">path</span> <span class="identifier">lib_path</span><span class="special">(</span><span class="identifier">argv</span><span class="special">[</span><span class="number">1</span><span class="special">]);</span> <span class="comment">// argv[1] contains path to directory with our plugin library</span>
<span class="identifier">smart_library</span> <span class="identifier">lib</span><span class="special">(</span><span class="identifier">lib_path</span><span class="special">);//</span> <span class="identifier">smart</span> <span class="identifier">library</span> <span class="identifier">instance</span>
</pre>
<p>
</p>
<p>
Similar to the previous example, we need the size of the class.
</p>
<p>
</p>
<pre class="programlisting"><span class="keyword">auto</span> <span class="identifier">size_f</span> <span class="special">=</span> <span class="identifier">import_mangled</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">()&gt;(</span><span class="string">"space::my_plugin::size"</span><span class="special">);</span> <span class="comment">//get the size function</span>
<span class="keyword">auto</span> <span class="identifier">size</span> <span class="special">=</span> <span class="special">(*</span><span class="identifier">size_f</span><span class="special">)();</span> <span class="comment">// get the size of the class</span>
</pre>
<p>
</p>
<p>
On a side note, we can also import variable easily with that function.
</p>
<p>
</p>
<pre class="programlisting"><span class="keyword">auto</span> <span class="identifier">value</span> <span class="special">=</span> <span class="identifier">import_mangled</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">lib</span><span class="special">,</span> <span class="string">"space::my_plugin::value"</span><span class="special">);</span>
</pre>
<p>
</p>
<p>
We do the forward declaration on the first call, and invoke the constructor
directly. This is quite simple and allows to invoke the constructor directly.
The destructor will be invoked automatically.
</p>
<p>
</p>
<pre class="programlisting"><span class="keyword">auto</span> <span class="identifier">cl</span> <span class="special">=</span> <span class="identifier">import_class</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">alias</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&amp;&gt;(</span><span class="identifier">lib</span><span class="special">,</span> <span class="string">"space::my_plugin::some_class"</span><span class="special">,</span> <span class="identifier">size</span><span class="special">,</span> <span class="string">"MyName"</span><span class="special">);</span>
</pre>
<p>
</p>
<p>
Invoking a function will still require to import it first.
</p>
<p>
</p>
<pre class="programlisting"><span class="keyword">auto</span> <span class="identifier">name</span> <span class="special">=</span> <span class="identifier">import_mangled</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="identifier">alias</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">()&gt;(</span><span class="identifier">lib</span><span class="special">,</span> <span class="string">"name"</span><span class="special">);</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"Name: "</span> <span class="special">&lt;&lt;</span> <span class="special">(</span><span class="identifier">cl</span><span class="special">-&gt;*</span><span class="identifier">name</span><span class="special">)()</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
</pre>
<p>
</p>
<p>
For overloaded functions, we can import them as groups, which will give us
an object containing the overloads.
</p>
<p>
</p>
<pre class="programlisting"><span class="keyword">auto</span> <span class="identifier">calc</span> <span class="special">=</span> <span class="identifier">import_mangled</span><span class="special">&lt;</span><span class="identifier">alias</span><span class="special">,</span> <span class="keyword">float</span><span class="special">(</span><span class="keyword">float</span><span class="special">,</span> <span class="keyword">float</span><span class="special">),</span> <span class="keyword">int</span><span class="special">(</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">int</span><span class="special">)&gt;(</span><span class="identifier">lib</span><span class="special">,</span> <span class="string">"calculate"</span><span class="special">);</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"Calc(float): "</span> <span class="special">(</span><span class="identifier">cl</span><span class="special">-&gt;*</span><span class="identifier">calc</span><span class="special">)(</span><span class="number">5.f</span><span class="special">,</span> <span class="number">2.f</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"Calc(int): "</span> <span class="special">(</span><span class="identifier">cl</span><span class="special">-&gt;*</span><span class="identifier">calc</span><span class="special">)(</span><span class="number">5</span><span class="special">,</span> <span class="number">2</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
</pre>
<p>
</p>
<p>
Additionally, we can access the typeinfo like this.
</p>
<p>
</p>
<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">type_info</span> <span class="special">&amp;</span><span class="identifier">ti</span> <span class="special">=</span> <span class="identifier">cl</span><span class="special">.</span><span class="identifier">get_type_info</span><span class="special">();</span>
</pre>
<p>
</p>
<p>
<a class="link" href="mangled_import.html" title="Mangled Import">Back to the Top</a>
</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_dll.mangled_import.overloading_qualifiers"></a><a class="link" href="mangled_import.html#boost_dll.mangled_import.overloading_qualifiers" title="Overloading qualifiers">Overloading
qualifiers</a>
</h3></div></div></div>
<p>
Not handled in the example was the question, of how it is handled if the
qualification differs for an overloaded function. This can be done, by passing
the class again with another qualification - a function signature will always
pick the last one provided.
</p>
<p>
If we have this in our plugin:
</p>
<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">plugin</span>
<span class="special">{</span>
<span class="keyword">void</span> <span class="identifier">f</span><span class="special">(</span><span class="keyword">int</span><span class="special">);</span>
<span class="keyword">void</span> <span class="identifier">f</span><span class="special">(</span><span class="keyword">double</span><span class="special">);</span>
<span class="keyword">void</span> <span class="identifier">f</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
<span class="keyword">void</span> <span class="identifier">f</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span>
<span class="keyword">void</span> <span class="identifier">f</span><span class="special">()</span> <span class="keyword">volatile</span><span class="special">;</span>
<span class="keyword">void</span> <span class="identifier">f</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> <span class="keyword">volatile</span><span class="special">;</span>
<span class="keyword">void</span> <span class="identifier">f</span><span class="special">(</span><span class="keyword">double</span><span class="special">);</span> <span class="keyword">const</span> <span class="keyword">volatile</span><span class="special">;</span>
<span class="special">};</span>
</pre>
<p>
</p>
<p>
we can import them all at once, with the following command:
</p>
<p>
</p>
<pre class="programlisting"><span class="keyword">auto</span> <span class="identifier">f</span> <span class="special">=</span> <span class="identifier">import_class</span><span class="special">&lt;</span>
<span class="identifier">alias</span><span class="special">,</span> <span class="identifier">f</span><span class="special">(</span><span class="keyword">int</span><span class="special">),</span> <span class="identifier">f</span><span class="special">(</span><span class="keyword">double</span><span class="special">),</span> <span class="comment">//not qualified</span>
<span class="keyword">const</span> <span class="identifier">alias</span><span class="special">,</span> <span class="identifier">f</span><span class="special">(</span><span class="keyword">int</span><span class="special">),</span> <span class="identifier">f</span><span class="special">(),</span> <span class="comment">//const</span>
<span class="keyword">volatile</span> <span class="identifier">alias</span><span class="special">,</span> <span class="identifier">f</span><span class="special">(),</span> <span class="identifier">f</span><span class="special">(</span><span class="keyword">int</span><span class="special">),</span> <span class="comment">//volatile</span>
<span class="keyword">const</span> <span class="keyword">volatile</span> <span class="identifier">alias</span><span class="special">,</span> <span class="identifier">f</span><span class="special">(</span><span class="keyword">double</span><span class="special">)//</span><span class="keyword">const</span> <span class="keyword">volatile</span>
<span class="special">&gt;(</span><span class="identifier">lib</span><span class="special">,</span> <span class="string">"f"</span><span class="special">);</span>
</pre>
<p>
</p>
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright © 2014 Renato Tegon Forti, Antony Polukhin<br>Copyright © 2015 Antony Polukhin<br>Copyright © 2016 Antony Polukhin, Klemens Morgenstern<br>Copyright © 2017-2021 Antony Polukhin<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="tutorial.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../boost_dll.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="missuses.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,193 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Missuses</title>
<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
<link rel="up" href="../boost_dll.html" title="Chapter 14. Boost.DLL">
<link rel="prev" href="mangled_import.html" title="Mangled Import">
<link rel="next" href="reference.html" title="Reference">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
<td align="center"><a href="../../../index.html">Home</a></td>
<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="mangled_import.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../boost_dll.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="reference.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="boost_dll.missuses"></a><a class="link" href="missuses.html" title="Missuses">Missuses</a>
</h2></div></div></div>
<div class="warning"><table border="0" summary="Warning">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
<th align="left">Warning</th>
</tr>
<tr><td align="left" valign="top"><p>
Typical errors and missuses are located in this section. Please read carefully,
this will save a lot of debugging time!
</p></td></tr>
</table></div>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">
<span class="bold"><strong>Issue:</strong></span> Program crashes on <code class="computeroutput"><span class="keyword">delete</span></code> or <code class="computeroutput"><span class="identifier">free</span><span class="special">()</span></code>.
</li>
<li class="listitem">
<span class="bold"><strong>Fix:</strong></span> Your plugin and program must use
the same Standard C++ and C libraries, both must be linked dynamically.
For Visual Studio use <a href="https://msdn.microsoft.com/library/2kzt1wy3%28v=vs.110%29.aspx" target="_top">/MD
or /MDd compiler switches</a>.
</li>
</ul></div>
<pre class="programlisting"></pre>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">
<span class="bold"><strong>Issue:</strong></span> Program crashes in <code class="computeroutput"><span class="keyword">catch</span><span class="special">(...)</span></code>
block.
</li>
<li class="listitem">
<span class="bold"><strong>Example:</strong></span>
<pre class="programlisting"><span class="keyword">try</span> <span class="special">{</span>
<span class="keyword">auto</span> <span class="identifier">f</span> <span class="special">=</span> <span class="identifier">dll</span><span class="special">::</span><span class="identifier">import</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">()&gt;(</span><span class="identifier">path_to_pugin</span><span class="special">,</span> <span class="string">"function"</span><span class="special">);</span>
<span class="identifier">f</span><span class="special">();</span>
<span class="comment">// `f` goes out of scope</span>
<span class="special">}</span> <span class="keyword">catch</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">exception</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">)</span> <span class="special">{</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cerr</span> <span class="special">&lt;&lt;</span> <span class="identifier">e</span><span class="special">.</span><span class="identifier">what</span><span class="special">();</span>
<span class="special">}</span>
</pre>
</li>
<li class="listitem">
<span class="bold"><strong>Fix:</strong></span> Exception was generated inside the
plugin, so it refers to the exception code in plugin. When <code class="computeroutput"><span class="identifier">f</span></code> goes out of scope, the plugin gets
unloaded and the reference to the exception code is broken. Any attempt
to use the exception variable may use the dangling reference, leading to
a segmentation fault. Fix your code:
<pre class="programlisting"><span class="keyword">auto</span> <span class="identifier">f</span> <span class="special">=</span> <span class="identifier">dll</span><span class="special">::</span><span class="identifier">import</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">()&gt;(</span><span class="identifier">path_to_pugin</span><span class="special">,</span> <span class="string">"function"</span><span class="special">);</span>
<span class="keyword">try</span> <span class="special">{</span>
<span class="identifier">f</span><span class="special">();</span>
<span class="comment">// `f` goes out of scope</span>
<span class="special">}</span> <span class="keyword">catch</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">exception</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">)</span> <span class="special">{</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cerr</span> <span class="special">&lt;&lt;</span> <span class="identifier">e</span><span class="special">.</span><span class="identifier">what</span><span class="special">();</span>
<span class="special">}</span>
</pre>
</li>
</ul></div>
<pre class="programlisting"></pre>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">
<span class="bold"><strong>Issue:</strong></span> Thread local storage seems to be
corrupted.
</li>
<li class="listitem">
<span class="bold"><strong>Fix:</strong></span> Some platforms have no out-of-the-box
support for plugins that use TLS, for example <a href="https://support.microsoft.com/en-us/kb/118816" target="_top">Windows</a>.
Use platform specific workarounds or just do not use TLS in plugins.
</li>
</ul></div>
<pre class="programlisting"></pre>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">
<span class="bold"><strong>Issue:</strong></span> Attempt to call a loaded function
crashes or function returns incorrect result.
</li>
<li class="listitem">
<span class="bold"><strong>Fix:</strong></span> Boost.DLL does not guarantee ABI
stability. If you compile plugin and program with different compilers or
different compiler switches the function ABI may change and you'll end
up with incorrect code.
</li>
</ul></div>
<pre class="programlisting"></pre>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">
<span class="bold"><strong>Issue:</strong></span> Program crashes after plugin unload.
</li>
<li class="listitem">
<span class="bold"><strong>Example:</strong></span>
<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">foo</span><span class="special">()</span> <span class="special">{</span>
<span class="identifier">shared_ptr</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">p</span><span class="special">;</span>
<span class="keyword">try</span> <span class="special">{</span>
<span class="keyword">auto</span> <span class="identifier">f</span> <span class="special">=</span> <span class="identifier">dll</span><span class="special">::</span><span class="identifier">import</span><span class="special">&lt;</span><span class="identifier">shared_ptr</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;()&gt;(</span><span class="identifier">path_to_pugin</span><span class="special">,</span> <span class="string">"function"</span><span class="special">);</span>
<span class="identifier">p</span> <span class="special">=</span> <span class="identifier">f</span><span class="special">();</span>
<span class="comment">// `f` goes out of scope</span>
<span class="special">}</span> <span class="keyword">catch</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">exception</span><span class="special">&amp;</span> <span class="identifier">e</span><span class="special">)</span> <span class="special">{</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cerr</span> <span class="special">&lt;&lt;</span> <span class="identifier">e</span><span class="special">.</span><span class="identifier">what</span><span class="special">();</span>
<span class="special">}</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="special">*</span><span class="identifier">p</span><span class="special">;</span>
<span class="comment">// crashes here</span>
<span class="special">}</span>
</pre>
</li>
<li class="listitem">
<span class="bold"><strong>Fix:</strong></span> In that particular example the problem
is within <code class="computeroutput"><span class="identifier">shared_ptr</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span></code>.
It keeps a type erased deleter, code for that deleter is located in plugin.
On destruction of <code class="computeroutput"><span class="identifier">p</span></code>, <code class="computeroutput"><span class="identifier">shared_ptr</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span></code>
attempts to call that deleter, however the plugin was already unloaded
and the code for deleter is not available any more.
</li>
<li class="listitem">
<span class="bold"><strong>Rule of thumb:</strong></span>: if your plugin method
returns any C++ class variable, then make sure that the plugin is loaded
until that variable and any of its copies are in scope.
</li>
<li class="listitem">
<span class="bold"><strong>Typical classes that cause such errors are:</strong></span>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: circle; ">
<li class="listitem">
<code class="computeroutput"><span class="identifier">any</span></code>
</li>
<li class="listitem">
<code class="computeroutput"><span class="identifier">function</span></code>
</li>
<li class="listitem">
<code class="computeroutput"><span class="identifier">shared_ptr</span></code>
</li>
<li class="listitem">
any container with polymorphic allocator
</li>
<li class="listitem">
<code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">type_index</span></code>
</li>
<li class="listitem">
<code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">type_info</span></code>
</li>
<li class="listitem">
<code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">exception_ptr</span></code>
</li>
<li class="listitem">
<code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="identifier">Base</span><span class="special">&gt;</span></code>
holding a <code class="computeroutput"><span class="identifier">Derived</span></code>
type from plugin
</li>
<li class="listitem">
exception classes thrown from plugin
</li>
</ul></div>
</li>
</ul></div>
<pre class="programlisting"></pre>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright © 2014 Renato Tegon Forti, Antony Polukhin<br>Copyright © 2015 Antony Polukhin<br>Copyright © 2016 Antony Polukhin, Klemens Morgenstern<br>Copyright © 2017-2021 Antony Polukhin<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="mangled_import.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../boost_dll.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="reference.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,366 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Reference</title>
<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
<link rel="up" href="../boost_dll.html" title="Chapter 14. Boost.DLL">
<link rel="prev" href="missuses.html" title="Missuses">
<link rel="next" href="../BOOST_DL_idm45601578452480.html" title="Macro BOOST_DLL_FORCE_ALIAS_INSTANTIATION">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
<td align="center"><a href="../../../index.html">Home</a></td>
<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="missuses.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../boost_dll.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../BOOST_DL_idm45601578452480.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="boost_dll.reference"></a><a class="link" href="reference.html" title="Reference">Reference</a>
</h2></div></div></div>
<div class="toc"><dl class="toc">
<dt><span class="section"><a href="reference.html#shared_library_reference">Shared Library Reference</a></span></dt>
<dt><span class="section"><a href="reference.html#shared_library_refcountable_reference">Shared Library Refcountable Reference</a></span></dt>
</dl></div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="shared_library_reference"></a>Shared Library Reference</h3></div></div></div>
<div class="toc"><dl class="toc">
<dt><span class="section"><a href="reference.html#header.boost.dll.alias_hpp">Header &lt;boost/dll/alias.hpp&gt;</a></span></dt>
<dt><span class="section"><a href="reference.html#header.boost.dll.config_hpp">Header &lt;boost/dll/config.hpp&gt;</a></span></dt>
<dt><span class="section"><a href="reference.html#header.boost.dll.library_info_hpp">Header &lt;boost/dll/library_info.hpp&gt;</a></span></dt>
<dt><span class="section"><a href="reference.html#header.boost.dll.runtime_symbol_info_hpp">Header &lt;boost/dll/runtime_symbol_info.hpp&gt;</a></span></dt>
<dt><span class="section"><a href="reference.html#header.boost.dll.shared_library_hpp">Header &lt;boost/dll/shared_library.hpp&gt;</a></span></dt>
<dt><span class="section"><a href="reference.html#header.boost.dll.shared_library_load_mode_hpp">Header &lt;boost/dll/shared_library_load_mode.hpp&gt;</a></span></dt>
<dt><span class="section"><a href="reference.html#header.boost.dll.smart_library_hpp">Header &lt;boost/dll/smart_library.hpp&gt;</a></span></dt>
</dl></div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="header.boost.dll.alias_hpp"></a>Header &lt;<a href="http://www.boost.org/doc/libs/1_60_0/boost/dll/alias.hpp" target="_top">boost/dll/alias.hpp</a>&gt;</h4></div></div></div>
<p>Includes alias methods and macro. You can include this header or boost/dll/shared_library.hpp to reduce dependencies in case you do not use the refcountable functions. </p>
<pre class="synopsis">
<a class="link" href="../BOOST_DL_idm45601578452480.html" title="Macro BOOST_DLL_FORCE_ALIAS_INSTANTIATION">BOOST_DLL_FORCE_ALIAS_INSTANTIATION</a>
<a class="link" href="../BOOST_DL_idm45601578450672.html" title="Macro BOOST_DLL_FORCE_NO_WEAK_EXPORTS">BOOST_DLL_FORCE_NO_WEAK_EXPORTS</a>
<a class="link" href="../BOOST_DLL_SELECTANY.html" title="Macro BOOST_DLL_SELECTANY">BOOST_DLL_SELECTANY</a>
<a class="link" href="../BOOST_DLL_SECTION.html" title="Macro BOOST_DLL_SECTION">BOOST_DLL_SECTION</a>(SectionName, Permissions)
<a class="link" href="../BOOST_DLL_ALIAS.html" title="Macro BOOST_DLL_ALIAS">BOOST_DLL_ALIAS</a>(FunctionOrVar, AliasName)
<a class="link" href="../BOOST_DLL_ALIAS_SECTIONED.html" title="Macro BOOST_DLL_ALIAS_SECTIONED">BOOST_DLL_ALIAS_SECTIONED</a>(FunctionOrVar, AliasName, SectionName)
<a class="link" href="../BOOST_DLL_AUTO_ALIAS.html" title="Macro BOOST_DLL_AUTO_ALIAS">BOOST_DLL_AUTO_ALIAS</a>(FunctionOrVar)</pre>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="header.boost.dll.config_hpp"></a>Header &lt;<a href="http://www.boost.org/doc/libs/1_60_0/boost/dll/config.hpp" target="_top">boost/dll/config.hpp</a>&gt;</h4></div></div></div>
<p>Imports filesystem, error_code, errc, system_error, make_error_code from Boost or C++17 into <code class="computeroutput">boost::dll::fs</code> namespace. </p>
<pre class="synopsis">
<a class="link" href="../BOOST_DLL_USE_STD_FS.html" title="Macro BOOST_DLL_USE_STD_FS">BOOST_DLL_USE_STD_FS</a></pre>
<pre class="synopsis"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
<span class="keyword">namespace</span> <span class="identifier">dll</span> <span class="special">{</span>
<span class="keyword">namespace</span> <span class="identifier">fs</span> <span class="special">{</span>
<span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">conditional_t</span><span class="special">&lt;</span> <span class="identifier">BOOST_DLL_USE_STD_FS</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">filesystem</span><span class="special">::</span><span class="identifier">path</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">filesystem</span><span class="special">::</span><span class="identifier">path</span> <span class="special">&gt;</span> <a class="link" href="../boost/dll/fs/path.html" title="Type definition path"><span class="identifier">path</span></a><span class="special">;</span>
<span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">conditional_t</span><span class="special">&lt;</span> <span class="identifier">BOOST_DLL_USE_STD_FS</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">error_code</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">system</span><span class="special">::</span><span class="identifier">error_code</span> <span class="special">&gt;</span> <a class="link" href="../boost/dll/fs/error_code.html" title="Type definition error_code"><span class="identifier">error_code</span></a><span class="special">;</span>
<span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">conditional_t</span><span class="special">&lt;</span> <span class="identifier">BOOST_DLL_USE_STD_FS</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">system_error</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">system</span><span class="special">::</span><span class="identifier">system_error</span> <span class="special">&gt;</span> <a class="link" href="../boost/dll/fs/system_error.html" title="Type definition system_error"><span class="identifier">system_error</span></a><span class="special">;</span>
<span class="special">}</span>
<span class="special">}</span>
<span class="special">}</span></pre>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="header.boost.dll.library_info_hpp"></a>Header &lt;<a href="http://www.boost.org/doc/libs/1_60_0/boost/dll/library_info.hpp" target="_top">boost/dll/library_info.hpp</a>&gt;</h4></div></div></div>
<p>Contains only the <a class="link" href="../boost/dll/library_info.html" title="Class library_info">boost::dll::library_info</a> class that is capable of extracting different information from binaries. </p>
<pre class="synopsis"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
<span class="keyword">namespace</span> <span class="identifier">dll</span> <span class="special">{</span>
<span class="keyword">class</span> <a class="link" href="../boost/dll/library_info.html" title="Class library_info">library_info</a><span class="special">;</span>
<span class="special">}</span>
<span class="special">}</span></pre>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="header.boost.dll.runtime_symbol_info_hpp"></a>Header &lt;<a href="http://www.boost.org/doc/libs/1_60_0/boost/dll/runtime_symbol_info.hpp" target="_top">boost/dll/runtime_symbol_info.hpp</a>&gt;</h4></div></div></div>
<p>Provides methods for getting acceptable by <a class="link" href="../boost/dll/shared_library.html" title="Class shared_library">boost::dll::shared_library</a> location of symbol, source line or program. </p>
<pre class="synopsis"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
<span class="keyword">namespace</span> <span class="identifier">dll</span> <span class="special">{</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">&gt;</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">dll</span><span class="special">::</span><span class="identifier">fs</span><span class="special">::</span><span class="identifier">path</span>
<a class="link" href="../boost/dll/symbol_location_ptr.html" title="Function symbol_location_ptr"><span class="identifier">symbol_location_ptr</span></a><span class="special">(</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">dll</span><span class="special">::</span><span class="identifier">fs</span><span class="special">::</span><span class="identifier">error_code</span> <span class="special">&amp;</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">&gt;</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">dll</span><span class="special">::</span><span class="identifier">fs</span><span class="special">::</span><span class="identifier">path</span> <a class="link" href="../boost/dll/symbol_location_ptr.html" title="Function symbol_location_ptr"><span class="identifier">symbol_location_ptr</span></a><span class="special">(</span><span class="identifier">T</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">&gt;</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">dll</span><span class="special">::</span><span class="identifier">fs</span><span class="special">::</span><span class="identifier">path</span>
<a class="link" href="../boost/dll/symbol_location.html" title="Function symbol_location"><span class="identifier">symbol_location</span></a><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span> <span class="special">&amp;</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">dll</span><span class="special">::</span><span class="identifier">fs</span><span class="special">::</span><span class="identifier">error_code</span> <span class="special">&amp;</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">&gt;</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">dll</span><span class="special">::</span><span class="identifier">fs</span><span class="special">::</span><span class="identifier">path</span> <a class="link" href="../boost/dll/symbol_location.html" title="Function symbol_location"><span class="identifier">symbol_location</span></a><span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span> <span class="special">&amp;</span><span class="special">)</span><span class="special">;</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">dll</span><span class="special">::</span><span class="identifier">fs</span><span class="special">::</span><span class="identifier">path</span> <a class="link" href="../boost/dll/this_line_location.html" title="Function this_line_location"><span class="identifier">this_line_location</span></a><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">dll</span><span class="special">::</span><span class="identifier">fs</span><span class="special">::</span><span class="identifier">error_code</span> <span class="special">&amp;</span><span class="special">)</span><span class="special">;</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">dll</span><span class="special">::</span><span class="identifier">fs</span><span class="special">::</span><span class="identifier">path</span> <a class="link" href="../boost/dll/this_line_location.html" title="Function this_line_location"><span class="identifier">this_line_location</span></a><span class="special">(</span><span class="special">)</span><span class="special">;</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">dll</span><span class="special">::</span><span class="identifier">fs</span><span class="special">::</span><span class="identifier">path</span> <a class="link" href="../boost/dll/program_location.html" title="Function program_location"><span class="identifier">program_location</span></a><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">dll</span><span class="special">::</span><span class="identifier">fs</span><span class="special">::</span><span class="identifier">error_code</span> <span class="special">&amp;</span><span class="special">)</span><span class="special">;</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">dll</span><span class="special">::</span><span class="identifier">fs</span><span class="special">::</span><span class="identifier">path</span> <a class="link" href="../boost/dll/program_location.html" title="Function program_location"><span class="identifier">program_location</span></a><span class="special">(</span><span class="special">)</span><span class="special">;</span>
<span class="special">}</span>
<span class="special">}</span></pre>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="header.boost.dll.shared_library_hpp"></a>Header &lt;<a href="http://www.boost.org/doc/libs/1_60_0/boost/dll/shared_library.hpp" target="_top">boost/dll/shared_library.hpp</a>&gt;</h4></div></div></div>
<p>Contains the <a class="link" href="../boost/dll/shared_library.html" title="Class shared_library">boost::dll::shared_library</a> class, core class for all the DLL/DSO operations. </p>
<pre class="synopsis"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
<span class="keyword">namespace</span> <span class="identifier">dll</span> <span class="special">{</span>
<span class="keyword">class</span> <a class="link" href="../boost/dll/shared_library.html" title="Class shared_library">shared_library</a><span class="special">;</span>
<span class="comment">// Very fast equality check that compares the actual DLL/DSO objects. Throws nothing. </span>
<span class="keyword">bool</span> <a name="boost.dll.operator=="></a><span class="keyword">operator</span><span class="special">==</span><span class="special">(</span><span class="keyword">const</span> <a class="link" href="../boost/dll/shared_library.html" title="Class shared_library">shared_library</a> <span class="special">&amp;</span> lhs<span class="special">,</span> <span class="keyword">const</span> <a class="link" href="../boost/dll/shared_library.html" title="Class shared_library">shared_library</a> <span class="special">&amp;</span> rhs<span class="special">)</span><span class="special">;</span>
<span class="comment">// Very fast inequality check that compares the actual DLL/DSO objects. Throws nothing. </span>
<span class="keyword">bool</span> <a name="boost.dll.operator!="></a><span class="keyword">operator</span><span class="special">!=</span><span class="special">(</span><span class="keyword">const</span> <a class="link" href="../boost/dll/shared_library.html" title="Class shared_library">shared_library</a> <span class="special">&amp;</span> lhs<span class="special">,</span> <span class="keyword">const</span> <a class="link" href="../boost/dll/shared_library.html" title="Class shared_library">shared_library</a> <span class="special">&amp;</span> rhs<span class="special">)</span><span class="special">;</span>
<span class="comment">// Compare the actual DLL/DSO objects without any guarantee to be stable between runs. Throws nothing. </span>
<span class="keyword">bool</span> <a name="boost.dll.operator_idm45601576949584"></a><span class="keyword">operator</span><span class="special">&lt;</span><span class="special">(</span><span class="keyword">const</span> <a class="link" href="../boost/dll/shared_library.html" title="Class shared_library">shared_library</a> <span class="special">&amp;</span> lhs<span class="special">,</span> <span class="keyword">const</span> <a class="link" href="../boost/dll/shared_library.html" title="Class shared_library">shared_library</a> <span class="special">&amp;</span> rhs<span class="special">)</span><span class="special">;</span>
<span class="comment">// Swaps two shared libraries. Does not invalidate symbols and functions loaded from libraries. Throws nothing. </span>
<span class="keyword">void</span> <a name="boost.dll.swap"></a><span class="identifier">swap</span><span class="special">(</span><a class="link" href="../boost/dll/shared_library.html" title="Class shared_library">shared_library</a> <span class="special">&amp;</span> lhs<span class="special">,</span> <a class="link" href="../boost/dll/shared_library.html" title="Class shared_library">shared_library</a> <span class="special">&amp;</span> rhs<span class="special">)</span><span class="special">;</span>
<span class="special">}</span>
<span class="special">}</span></pre>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="header.boost.dll.shared_library_load_mode_hpp"></a>Header &lt;<a href="http://www.boost.org/doc/libs/1_60_0/boost/dll/shared_library_load_mode.hpp" target="_top">boost/dll/shared_library_load_mode.hpp</a>&gt;</h4></div></div></div>
<p>Contains only the boost::dll::load_mode::type enum and operators related to it. </p>
<pre class="synopsis"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
<span class="keyword">namespace</span> <span class="identifier">dll</span> <span class="special">{</span>
<span class="keyword">namespace</span> <span class="identifier">load_mode</span> <span class="special">{</span>
<span class="keyword">enum</span> <a class="link" href="../boost/dll/load_mode/type.html" title="Type type">type</a><span class="special">;</span>
<span class="comment">// Free operators for load_mode::type flag manipulation. </span>
<span class="identifier">BOOST_CONSTEXPR</span> <span class="identifier">type</span> <a name="boost.dll.load_mode.operator_idm45601576904640"></a><span class="keyword">operator</span><span class="special">|</span><span class="special">(</span><span class="identifier">type</span> left<span class="special">,</span> <span class="identifier">type</span> right<span class="special">)</span><span class="special">;</span>
<span class="identifier">BOOST_CXX14_CONSTEXPR</span> <span class="identifier">type</span> <span class="special">&amp;</span> <a name="boost.dll.load_mode.operator_idm45601576902096"></a><span class="keyword">operator</span><span class="special">|=</span><span class="special">(</span><span class="identifier">type</span> <span class="special">&amp;</span> left<span class="special">,</span> <span class="identifier">type</span> right<span class="special">)</span><span class="special">;</span>
<span class="identifier">BOOST_CONSTEXPR</span> <span class="identifier">type</span> <a name="boost.dll.load_mode.operator&amp;"></a><span class="keyword">operator</span><span class="special">&amp;</span><span class="special">(</span><span class="identifier">type</span> left<span class="special">,</span> <span class="identifier">type</span> right<span class="special">)</span><span class="special">;</span>
<span class="identifier">BOOST_CXX14_CONSTEXPR</span> <span class="identifier">type</span> <span class="special">&amp;</span> <a name="boost.dll.load_mode.operator&amp;="></a><span class="keyword">operator</span><span class="special">&amp;=</span><span class="special">(</span><span class="identifier">type</span> <span class="special">&amp;</span> left<span class="special">,</span> <span class="identifier">type</span> right<span class="special">)</span><span class="special">;</span>
<span class="identifier">BOOST_CONSTEXPR</span> <span class="identifier">type</span> <a name="boost.dll.load_mode.operator%5E"></a><span class="keyword">operator</span><span class="special">^</span><span class="special">(</span><span class="identifier">type</span> left<span class="special">,</span> <span class="identifier">type</span> right<span class="special">)</span><span class="special">;</span>
<span class="identifier">BOOST_CXX14_CONSTEXPR</span> <span class="identifier">type</span> <span class="special">&amp;</span> <a name="boost.dll.load_mode.operator%5E="></a><span class="keyword">operator</span><span class="special">^=</span><span class="special">(</span><span class="identifier">type</span> <span class="special">&amp;</span> left<span class="special">,</span> <span class="identifier">type</span> right<span class="special">)</span><span class="special">;</span>
<span class="identifier">BOOST_CONSTEXPR</span> <span class="identifier">type</span> <a name="boost.dll.load_mode.operator~"></a><span class="keyword">operator</span><span class="special">~</span><span class="special">(</span><span class="identifier">type</span> left<span class="special">)</span><span class="special">;</span>
<span class="special">}</span>
<span class="special">}</span>
<span class="special">}</span></pre>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="header.boost.dll.smart_library_hpp"></a>Header &lt;<a href="http://www.boost.org/doc/libs/1_60_0/boost/dll/smart_library.hpp" target="_top">boost/dll/smart_library.hpp</a>&gt;</h4></div></div></div>
<p>Contains the <a class="link" href="../boost/dll/experimental/smart_library.html" title="Class smart_library">boost::dll::experimental::smart_library</a> class for loading mangled symbols. </p>
<div class="warning"><table border="0" summary="Warning">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
<th align="left">Warning</th>
</tr>
<tr><td align="left" valign="top"><p>Extremely experimental! Requires C++11! Will change in next version of Boost! boost/dll/smart_library.hpp is not included in boost/dll.hpp </p></td></tr>
</table></div>
<p>
</p>
<pre class="synopsis"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
<span class="keyword">namespace</span> <span class="identifier">dll</span> <span class="special">{</span>
<span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
<span class="keyword">class</span> <a class="link" href="../boost/dll/experimental/smart_library.html" title="Class smart_library">smart_library</a><span class="special">;</span>
<span class="comment">// Very fast equality check that compares the actual DLL/DSO objects. Throws nothing. </span>
<span class="keyword">bool</span> <a name="boost.dll.experimental.operator=="></a><span class="keyword">operator</span><span class="special">==</span><span class="special">(</span><span class="keyword">const</span> <a class="link" href="../boost/dll/experimental/smart_library.html" title="Class smart_library">smart_library</a> <span class="special">&amp;</span> lhs<span class="special">,</span> <span class="keyword">const</span> <a class="link" href="../boost/dll/experimental/smart_library.html" title="Class smart_library">smart_library</a> <span class="special">&amp;</span> rhs<span class="special">)</span><span class="special">;</span>
<span class="comment">// Very fast inequality check that compares the actual DLL/DSO objects. Throws nothing. </span>
<span class="keyword">bool</span> <a name="boost.dll.experimental.operator!="></a><span class="keyword">operator</span><span class="special">!=</span><span class="special">(</span><span class="keyword">const</span> <a class="link" href="../boost/dll/experimental/smart_library.html" title="Class smart_library">smart_library</a> <span class="special">&amp;</span> lhs<span class="special">,</span> <span class="keyword">const</span> <a class="link" href="../boost/dll/experimental/smart_library.html" title="Class smart_library">smart_library</a> <span class="special">&amp;</span> rhs<span class="special">)</span><span class="special">;</span>
<span class="comment">// Compare the actual DLL/DSO objects without any guarantee to be stable between runs. Throws nothing. </span>
<span class="keyword">bool</span> <a name="boost.dll.experimental.operator_idm45601576730176"></a><span class="keyword">operator</span><span class="special">&lt;</span><span class="special">(</span><span class="keyword">const</span> <a class="link" href="../boost/dll/experimental/smart_library.html" title="Class smart_library">smart_library</a> <span class="special">&amp;</span> lhs<span class="special">,</span> <span class="keyword">const</span> <a class="link" href="../boost/dll/experimental/smart_library.html" title="Class smart_library">smart_library</a> <span class="special">&amp;</span> rhs<span class="special">)</span><span class="special">;</span>
<span class="comment">// Swaps two shared libraries. Does not invalidate symbols and functions loaded from libraries. Throws nothing. </span>
<span class="keyword">void</span> <a name="boost.dll.experimental.swap"></a><span class="identifier">swap</span><span class="special">(</span><a class="link" href="../boost/dll/experimental/smart_library.html" title="Class smart_library">smart_library</a> <span class="special">&amp;</span> lhs<span class="special">,</span> <a class="link" href="../boost/dll/experimental/smart_library.html" title="Class smart_library">smart_library</a> <span class="special">&amp;</span> rhs<span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">,</span> <span class="keyword">typename</span> T2<span class="special">&gt;</span>
<span class="keyword">void</span> <a class="link" href="../boost/dll/experimental/get_idm45601576723504.html" title="Function template get"><span class="identifier">get</span></a><span class="special">(</span><span class="keyword">const</span> <a class="link" href="../boost/dll/experimental/smart_library.html" title="Class smart_library">smart_library</a> <span class="special">&amp;</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&amp;</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">&gt;</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">enable_if</span><span class="special">&lt;</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_object</span><span class="special">&lt;</span> <span class="identifier">T</span> <span class="special">&gt;</span><span class="special">,</span> <span class="identifier">T</span> <span class="special">&amp;</span> <span class="special">&gt;</span><span class="special">::</span><span class="identifier">type</span>
<a class="link" href="../boost/dll/experimental/get_idm45601576715872.html" title="Function template get"><span class="identifier">get</span></a><span class="special">(</span><span class="keyword">const</span> <a class="link" href="../boost/dll/experimental/smart_library.html" title="Class smart_library">smart_library</a> <span class="special">&amp;</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&amp;</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">&gt;</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">enable_if</span><span class="special">&lt;</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_function</span><span class="special">&lt;</span> <span class="identifier">T</span> <span class="special">&gt;</span><span class="special">,</span> <span class="identifier">T</span> <span class="special">&amp;</span> <span class="special">&gt;</span><span class="special">::</span><span class="identifier">type</span>
<a class="link" href="../boost/dll/experimental/get_idm45601576708768.html" title="Function template get"><span class="identifier">get</span></a><span class="special">(</span><span class="keyword">const</span> <a class="link" href="../boost/dll/experimental/smart_library.html" title="Class smart_library">smart_library</a> <span class="special">&amp;</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&amp;</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> Class<span class="special">,</span> <span class="keyword">typename</span> Signature<span class="special">&gt;</span>
<span class="keyword">auto</span> <a class="link" href="../boost/dll/experimental/get_idm45601576701664.html" title="Function template get"><span class="identifier">get</span></a><span class="special">(</span><span class="keyword">const</span> <a class="link" href="../boost/dll/experimental/smart_library.html" title="Class smart_library">smart_library</a> <span class="special">&amp;</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&amp;</span><span class="special">)</span><span class="special">;</span>
<span class="special">}</span>
<span class="special">}</span>
<span class="special">}</span></pre>
</div>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="shared_library_refcountable_reference"></a>Shared Library Refcountable Reference</h3></div></div></div>
<div class="toc"><dl class="toc">
<dt><span class="section"><a href="reference.html#header.boost.dll.import_hpp">Header &lt;boost/dll/import.hpp&gt;</a></span></dt>
<dt><span class="section"><a href="reference.html#header.boost.dll.import_class_hpp">Header &lt;boost/dll/import_class.hpp&gt;</a></span></dt>
<dt><span class="section"><a href="reference.html#header.boost.dll.import_mangled_hpp">Header &lt;boost/dll/import_mangled.hpp&gt;</a></span></dt>
</dl></div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="header.boost.dll.import_hpp"></a>Header &lt;<a href="http://www.boost.org/doc/libs/1_60_0/boost/dll/import.hpp" target="_top">boost/dll/import.hpp</a>&gt;</h4></div></div></div>
<p>Contains all the boost::dll::import* reference counting functions that hold a shared pointer to the instance of boost::dll::shared_library. </p>
<pre class="synopsis"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
<span class="keyword">namespace</span> <span class="identifier">dll</span> <span class="special">{</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">&gt;</span>
<span class="identifier">result_type</span> <a class="link" href="../boost/dll/import_symbol.html" title="Function import_symbol"><span class="identifier">import_symbol</span></a><span class="special">(</span><span class="keyword">const</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">dll</span><span class="special">::</span><span class="identifier">fs</span><span class="special">::</span><span class="identifier">path</span> <span class="special">&amp;</span><span class="special">,</span> <span class="keyword">const</span> <span class="keyword">char</span> <span class="special">*</span><span class="special">,</span>
<span class="identifier">load_mode</span><span class="special">::</span><span class="identifier">type</span> <span class="special">=</span> <span class="identifier">load_mode</span><span class="special">::</span><span class="identifier">default_mode</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">&gt;</span>
<span class="identifier">result_type</span> <a class="link" href="../boost/dll/import_symbol.html" title="Function import_symbol"><span class="identifier">import_symbol</span></a><span class="special">(</span><span class="keyword">const</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">dll</span><span class="special">::</span><span class="identifier">fs</span><span class="special">::</span><span class="identifier">path</span> <span class="special">&amp;</span><span class="special">,</span>
<span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&amp;</span><span class="special">,</span>
<span class="identifier">load_mode</span><span class="special">::</span><span class="identifier">type</span> <span class="special">=</span> <span class="identifier">load_mode</span><span class="special">::</span><span class="identifier">default_mode</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">&gt;</span>
<span class="identifier">result_type</span> <a class="link" href="../boost/dll/import_symbol.html" title="Function import_symbol"><span class="identifier">import_symbol</span></a><span class="special">(</span><span class="keyword">const</span> <span class="identifier">shared_library</span> <span class="special">&amp;</span><span class="special">,</span> <span class="keyword">const</span> <span class="keyword">char</span> <span class="special">*</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">&gt;</span>
<span class="identifier">result_type</span> <a class="link" href="../boost/dll/import_symbol.html" title="Function import_symbol"><span class="identifier">import_symbol</span></a><span class="special">(</span><span class="keyword">const</span> <span class="identifier">shared_library</span> <span class="special">&amp;</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&amp;</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">&gt;</span>
<span class="identifier">result_type</span> <a class="link" href="../boost/dll/import_symbol.html" title="Function import_symbol"><span class="identifier">import_symbol</span></a><span class="special">(</span><span class="identifier">shared_library</span> <span class="special">&amp;&amp;</span><span class="special">,</span> <span class="keyword">const</span> <span class="keyword">char</span> <span class="special">*</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">&gt;</span>
<span class="identifier">result_type</span> <a class="link" href="../boost/dll/import_symbol.html" title="Function import_symbol"><span class="identifier">import_symbol</span></a><span class="special">(</span><span class="identifier">shared_library</span> <span class="special">&amp;&amp;</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&amp;</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">&gt;</span>
<span class="identifier">result_type</span> <a class="link" href="../boost/dll/import_alias.html" title="Function import_alias"><span class="identifier">import_alias</span></a><span class="special">(</span><span class="keyword">const</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">dll</span><span class="special">::</span><span class="identifier">fs</span><span class="special">::</span><span class="identifier">path</span> <span class="special">&amp;</span><span class="special">,</span> <span class="keyword">const</span> <span class="keyword">char</span> <span class="special">*</span><span class="special">,</span>
<span class="identifier">load_mode</span><span class="special">::</span><span class="identifier">type</span> <span class="special">=</span> <span class="identifier">load_mode</span><span class="special">::</span><span class="identifier">default_mode</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">&gt;</span>
<span class="identifier">result_type</span> <a class="link" href="../boost/dll/import_alias.html" title="Function import_alias"><span class="identifier">import_alias</span></a><span class="special">(</span><span class="keyword">const</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">dll</span><span class="special">::</span><span class="identifier">fs</span><span class="special">::</span><span class="identifier">path</span> <span class="special">&amp;</span><span class="special">,</span>
<span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&amp;</span><span class="special">,</span>
<span class="identifier">load_mode</span><span class="special">::</span><span class="identifier">type</span> <span class="special">=</span> <span class="identifier">load_mode</span><span class="special">::</span><span class="identifier">default_mode</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">&gt;</span>
<span class="identifier">result_type</span> <a class="link" href="../boost/dll/import_alias.html" title="Function import_alias"><span class="identifier">import_alias</span></a><span class="special">(</span><span class="keyword">const</span> <span class="identifier">shared_library</span> <span class="special">&amp;</span><span class="special">,</span> <span class="keyword">const</span> <span class="keyword">char</span> <span class="special">*</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">&gt;</span>
<span class="identifier">result_type</span> <a class="link" href="../boost/dll/import_alias.html" title="Function import_alias"><span class="identifier">import_alias</span></a><span class="special">(</span><span class="keyword">const</span> <span class="identifier">shared_library</span> <span class="special">&amp;</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&amp;</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">&gt;</span>
<span class="identifier">result_type</span> <a class="link" href="../boost/dll/import_alias.html" title="Function import_alias"><span class="identifier">import_alias</span></a><span class="special">(</span><span class="identifier">shared_library</span> <span class="special">&amp;&amp;</span><span class="special">,</span> <span class="keyword">const</span> <span class="keyword">char</span> <span class="special">*</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">&gt;</span>
<span class="identifier">result_type</span> <a class="link" href="../boost/dll/import_alias.html" title="Function import_alias"><span class="identifier">import_alias</span></a><span class="special">(</span><span class="identifier">shared_library</span> <span class="special">&amp;&amp;</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&amp;</span><span class="special">)</span><span class="special">;</span>
<span class="special">}</span>
<span class="special">}</span></pre>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="header.boost.dll.import_class_hpp"></a>Header &lt;<a href="http://www.boost.org/doc/libs/1_60_0/boost/dll/import_class.hpp" target="_top">boost/dll/import_class.hpp</a>&gt;</h4></div></div></div>
<p>Contains the boost::dll::experimental::import_class function for importing classes. </p>
<div class="warning"><table border="0" summary="Warning">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
<th align="left">Warning</th>
</tr>
<tr><td align="left" valign="top"><p>Extremely experimental! Requires C++11! Will change in next version of Boost! boost/dll/import_class.hpp is not included in boost/dll.hpp </p></td></tr>
</table></div>
<p>
</p>
<pre class="synopsis"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
<span class="keyword">namespace</span> <span class="identifier">dll</span> <span class="special">{</span>
<span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">&gt;</span> <span class="keyword">class</span> <a class="link" href="../boost/dll/experimental/imported_class.html" title="Class template imported_class">imported_class</a><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> Args<span class="special">&gt;</span>
<a class="link" href="../boost/dll/experimental/imported_class.html" title="Class template imported_class">imported_class</a><span class="special">&lt;</span> <span class="identifier">T</span> <span class="special">&gt;</span>
<a class="link" href="../boost/dll/experimental/import_c_idm45601577313504.html" title="Function import_class"><span class="identifier">import_class</span></a><span class="special">(</span><span class="keyword">const</span> <span class="identifier">smart_library</span> <span class="special">&amp;</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">,</span> <span class="identifier">Args</span><span class="special">...</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> Args<span class="special">&gt;</span>
<a class="link" href="../boost/dll/experimental/imported_class.html" title="Class template imported_class">imported_class</a><span class="special">&lt;</span> <span class="identifier">T</span> <span class="special">&gt;</span>
<a class="link" href="../boost/dll/experimental/import_c_idm45601577313504.html" title="Function import_class"><span class="identifier">import_class</span></a><span class="special">(</span><span class="keyword">const</span> <span class="identifier">smart_library</span> <span class="special">&amp;</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&amp;</span><span class="special">,</span>
<span class="identifier">Args</span><span class="special">...</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> Args<span class="special">&gt;</span>
<a class="link" href="../boost/dll/experimental/imported_class.html" title="Class template imported_class">imported_class</a><span class="special">&lt;</span> <span class="identifier">T</span> <span class="special">&gt;</span>
<a class="link" href="../boost/dll/experimental/import_c_idm45601577313504.html" title="Function import_class"><span class="identifier">import_class</span></a><span class="special">(</span><span class="keyword">const</span> <span class="identifier">smart_library</span> <span class="special">&amp;</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&amp;</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">,</span>
<span class="identifier">Args</span><span class="special">...</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> Args<span class="special">&gt;</span>
<a class="link" href="../boost/dll/experimental/imported_class.html" title="Class template imported_class">imported_class</a><span class="special">&lt;</span> <span class="identifier">T</span> <span class="special">&gt;</span> <a class="link" href="../boost/dll/experimental/import_c_idm45601577313504.html" title="Function import_class"><span class="identifier">import_class</span></a><span class="special">(</span><span class="identifier">smart_library</span> <span class="special">&amp;&amp;</span><span class="special">,</span> <span class="identifier">Args</span><span class="special">...</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> Args<span class="special">&gt;</span>
<a class="link" href="../boost/dll/experimental/imported_class.html" title="Class template imported_class">imported_class</a><span class="special">&lt;</span> <span class="identifier">T</span> <span class="special">&gt;</span>
<a class="link" href="../boost/dll/experimental/import_c_idm45601577313504.html" title="Function import_class"><span class="identifier">import_class</span></a><span class="special">(</span><span class="identifier">smart_library</span> <span class="special">&amp;&amp;</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&amp;</span><span class="special">,</span> <span class="identifier">Args</span><span class="special">...</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> Args<span class="special">&gt;</span>
<a class="link" href="../boost/dll/experimental/imported_class.html" title="Class template imported_class">imported_class</a><span class="special">&lt;</span> <span class="identifier">T</span> <span class="special">&gt;</span>
<a class="link" href="../boost/dll/experimental/import_c_idm45601577313504.html" title="Function import_class"><span class="identifier">import_class</span></a><span class="special">(</span><span class="identifier">smart_library</span> <span class="special">&amp;&amp;</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">,</span> <span class="identifier">Args</span><span class="special">...</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> Args<span class="special">&gt;</span>
<a class="link" href="../boost/dll/experimental/imported_class.html" title="Class template imported_class">imported_class</a><span class="special">&lt;</span> <span class="identifier">T</span> <span class="special">&gt;</span>
<a class="link" href="../boost/dll/experimental/import_c_idm45601577313504.html" title="Function import_class"><span class="identifier">import_class</span></a><span class="special">(</span><span class="identifier">smart_library</span> <span class="special">&amp;&amp;</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&amp;</span><span class="special">,</span>
<span class="identifier">Args</span><span class="special">...</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> Args<span class="special">&gt;</span>
<a class="link" href="../boost/dll/experimental/imported_class.html" title="Class template imported_class">imported_class</a><span class="special">&lt;</span> <span class="identifier">T</span> <span class="special">&gt;</span>
<a class="link" href="../boost/dll/experimental/import_c_idm45601577313504.html" title="Function import_class"><span class="identifier">import_class</span></a><span class="special">(</span><span class="identifier">smart_library</span> <span class="special">&amp;&amp;</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&amp;</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">,</span>
<span class="identifier">Args</span><span class="special">...</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> Args<span class="special">&gt;</span>
<a class="link" href="../boost/dll/experimental/imported_class.html" title="Class template imported_class">imported_class</a><span class="special">&lt;</span> <span class="identifier">T</span> <span class="special">&gt;</span> <a name="boost.dll.experimental.import_c_idm45601577268624"></a><span class="identifier">import_class</span><span class="special">(</span><span class="identifier">smart_library</span> <span class="special">&amp;</span> lib<span class="special">,</span> <span class="identifier">Args</span><span class="special">...</span> args<span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> Args<span class="special">&gt;</span>
<a class="link" href="../boost/dll/experimental/imported_class.html" title="Class template imported_class">imported_class</a><span class="special">&lt;</span> <span class="identifier">T</span> <span class="special">&gt;</span>
<a name="boost.dll.experimental.import_c_idm45601577264416"></a><span class="identifier">import_class</span><span class="special">(</span><span class="identifier">smart_library</span> <span class="special">&amp;</span> lib<span class="special">,</span> <span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&amp;</span> alias_name<span class="special">,</span>
<span class="identifier">Args</span><span class="special">...</span> args<span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> Args<span class="special">&gt;</span>
<a class="link" href="../boost/dll/experimental/imported_class.html" title="Class template imported_class">imported_class</a><span class="special">&lt;</span> <span class="identifier">T</span> <span class="special">&gt;</span>
<a name="boost.dll.experimental.import_c_idm45601577259520"></a><span class="identifier">import_class</span><span class="special">(</span><span class="identifier">smart_library</span> <span class="special">&amp;</span> lib<span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> size<span class="special">,</span> <span class="identifier">Args</span><span class="special">...</span> args<span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> Args<span class="special">&gt;</span>
<a class="link" href="../boost/dll/experimental/imported_class.html" title="Class template imported_class">imported_class</a><span class="special">&lt;</span> <span class="identifier">T</span> <span class="special">&gt;</span>
<a name="boost.dll.experimental.import_c_idm45601577254624"></a><span class="identifier">import_class</span><span class="special">(</span><span class="identifier">smart_library</span> <span class="special">&amp;</span> lib<span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> size<span class="special">,</span>
<span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&amp;</span> alias_name<span class="special">,</span> <span class="identifier">Args</span><span class="special">...</span> args<span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> T<span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> Args<span class="special">&gt;</span>
<a class="link" href="../boost/dll/experimental/imported_class.html" title="Class template imported_class">imported_class</a><span class="special">&lt;</span> <span class="identifier">T</span> <span class="special">&gt;</span>
<a name="boost.dll.experimental.import_c_idm45601577249040"></a><span class="identifier">import_class</span><span class="special">(</span><span class="identifier">smart_library</span> <span class="special">&amp;</span> lib<span class="special">,</span> <span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&amp;</span> alias_name<span class="special">,</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> size<span class="special">,</span> <span class="identifier">Args</span><span class="special">...</span> args<span class="special">)</span><span class="special">;</span>
<span class="special">}</span>
<span class="special">}</span>
<span class="special">}</span></pre>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="header.boost.dll.import_mangled_hpp"></a>Header &lt;<a href="http://www.boost.org/doc/libs/1_60_0/boost/dll/import_mangled.hpp" target="_top">boost/dll/import_mangled.hpp</a>&gt;</h4></div></div></div>
<p>Contains the boost::dll::experimental::import_mangled function for importing mangled symbols. </p>
<div class="warning"><table border="0" summary="Warning">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
<th align="left">Warning</th>
</tr>
<tr><td align="left" valign="top"><p>Extremely experimental! Requires C++11! Will change in next version of Boost! boost/dll/import_mangled.hpp is not included in boost/dll.hpp </p></td></tr>
</table></div>
<p>
</p>
<pre class="synopsis"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
<span class="keyword">namespace</span> <span class="identifier">dll</span> <span class="special">{</span>
<span class="keyword">namespace</span> <span class="identifier">experimental</span> <span class="special">{</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="special">...</span> Args<span class="special">&gt;</span>
<span class="identifier">result_type</span> <a class="link" href="../boost/dll/experimental/import_mangled.html" title="Function import_mangled"><span class="identifier">import_mangled</span></a><span class="special">(</span><span class="keyword">const</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">dll</span><span class="special">::</span><span class="identifier">fs</span><span class="special">::</span><span class="identifier">path</span> <span class="special">&amp;</span><span class="special">,</span> <span class="keyword">const</span> <span class="keyword">char</span> <span class="special">*</span><span class="special">,</span>
<span class="identifier">load_mode</span><span class="special">::</span><span class="identifier">type</span> <span class="special">=</span> <span class="identifier">load_mode</span><span class="special">::</span><span class="identifier">default_mode</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="special">...</span> Args<span class="special">&gt;</span>
<span class="identifier">result_type</span> <a class="link" href="../boost/dll/experimental/import_mangled.html" title="Function import_mangled"><span class="identifier">import_mangled</span></a><span class="special">(</span><span class="keyword">const</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">dll</span><span class="special">::</span><span class="identifier">fs</span><span class="special">::</span><span class="identifier">path</span> <span class="special">&amp;</span><span class="special">,</span>
<span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&amp;</span><span class="special">,</span>
<span class="identifier">load_mode</span><span class="special">::</span><span class="identifier">type</span> <span class="special">=</span> <span class="identifier">load_mode</span><span class="special">::</span><span class="identifier">default_mode</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="special">...</span> Args<span class="special">&gt;</span>
<span class="identifier">result_type</span> <a class="link" href="../boost/dll/experimental/import_mangled.html" title="Function import_mangled"><span class="identifier">import_mangled</span></a><span class="special">(</span><span class="keyword">const</span> <span class="identifier">smart_library</span> <span class="special">&amp;</span><span class="special">,</span> <span class="keyword">const</span> <span class="keyword">char</span> <span class="special">*</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="special">...</span> Args<span class="special">&gt;</span>
<span class="identifier">result_type</span> <a class="link" href="../boost/dll/experimental/import_mangled.html" title="Function import_mangled"><span class="identifier">import_mangled</span></a><span class="special">(</span><span class="keyword">const</span> <span class="identifier">smart_library</span> <span class="special">&amp;</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&amp;</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="special">...</span> Args<span class="special">&gt;</span>
<span class="identifier">result_type</span> <a class="link" href="../boost/dll/experimental/import_mangled.html" title="Function import_mangled"><span class="identifier">import_mangled</span></a><span class="special">(</span><span class="identifier">smart_library</span> <span class="special">&amp;&amp;</span><span class="special">,</span> <span class="keyword">const</span> <span class="keyword">char</span> <span class="special">*</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="special">...</span> Args<span class="special">&gt;</span>
<span class="identifier">result_type</span> <a class="link" href="../boost/dll/experimental/import_mangled.html" title="Function import_mangled"><span class="identifier">import_mangled</span></a><span class="special">(</span><span class="identifier">smart_library</span> <span class="special">&amp;&amp;</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&amp;</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="special">...</span> Args<span class="special">&gt;</span>
<span class="identifier">result_type</span> <a class="link" href="../boost/dll/experimental/import_mangled.html" title="Function import_mangled"><span class="identifier">import_mangled</span></a><span class="special">(</span><span class="keyword">const</span> <span class="identifier">shared_library</span> <span class="special">&amp;</span><span class="special">,</span> <span class="keyword">const</span> <span class="keyword">char</span> <span class="special">*</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="special">...</span> Args<span class="special">&gt;</span>
<span class="identifier">result_type</span> <a class="link" href="../boost/dll/experimental/import_mangled.html" title="Function import_mangled"><span class="identifier">import_mangled</span></a><span class="special">(</span><span class="keyword">const</span> <span class="identifier">shared_library</span> <span class="special">&amp;</span><span class="special">,</span>
<span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&amp;</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="special">...</span> Args<span class="special">&gt;</span>
<span class="identifier">result_type</span> <a class="link" href="../boost/dll/experimental/import_mangled.html" title="Function import_mangled"><span class="identifier">import_mangled</span></a><span class="special">(</span><span class="identifier">shared_library</span> <span class="special">&amp;&amp;</span><span class="special">,</span> <span class="keyword">const</span> <span class="keyword">char</span> <span class="special">*</span><span class="special">)</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="special">...</span> Args<span class="special">&gt;</span>
<span class="identifier">result_type</span> <a class="link" href="../boost/dll/experimental/import_mangled.html" title="Function import_mangled"><span class="identifier">import_mangled</span></a><span class="special">(</span><span class="identifier">shared_library</span> <span class="special">&amp;&amp;</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&amp;</span><span class="special">)</span><span class="special">;</span>
<span class="special">}</span>
<span class="special">}</span>
<span class="special">}</span></pre>
</div>
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright © 2014 Renato Tegon Forti, Antony Polukhin<br>Copyright © 2015 Antony Polukhin<br>Copyright © 2016 Antony Polukhin, Klemens Morgenstern<br>Copyright © 2017-2021 Antony Polukhin<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="missuses.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../boost_dll.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../BOOST_DL_idm45601578452480.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,126 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Revision History</title>
<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
<link rel="up" href="../boost_dll.html" title="Chapter 14. Boost.DLL">
<link rel="prev" href="dependencies.html" title="Dependencies">
<link rel="next" href="acknowledgements.html" title="Acknowledgements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
<td align="center"><a href="../../../index.html">Home</a></td>
<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="dependencies.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../boost_dll.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="acknowledgements.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="boost_dll.revision_history"></a><a class="link" href="revision_history.html" title="Revision History">Revision History</a>
</h2></div></div></div>
<h6>
<a name="boost_dll.revision_history.h0"></a>
<span class="phrase"><a name="boost_dll.revision_history.1_0__first_boost_release_"></a></span><a class="link" href="revision_history.html#boost_dll.revision_history.1_0__first_boost_release_">1.0
(First Boost release)</a>
</h6>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">
Removed <code class="computeroutput"><span class="identifier">shared_library</span><span class="special">::</span><span class="identifier">load_self</span><span class="special">()</span></code>
</li>
<li class="listitem">
Renamed <code class="computeroutput"><span class="identifier">shared_library</span><span class="special">::</span><span class="identifier">path</span><span class="special">()</span></code> to <code class="computeroutput"><span class="identifier">shared_library</span><span class="special">::</span><span class="identifier">location</span><span class="special">()</span></code>
</li>
<li class="listitem">
<code class="computeroutput"><span class="identifier">import_function</span><span class="special">*</span></code>
and <code class="computeroutput"><span class="identifier">import_variable</span><span class="special">*</span></code>
functions were refactored into <code class="computeroutput"><span class="identifier">import</span><span class="special">*</span></code> functions
</li>
<li class="listitem">
Dropped dependency to 'boost::string_ref'
</li>
<li class="listitem">
Multiple MacOS and Android fixes
</li>
<li class="listitem">
Performance and memory optimizations for <code class="computeroutput"><span class="identifier">import</span><span class="special">*</span></code> functions
</li>
<li class="listitem">
Refactored <code class="computeroutput"><span class="identifier">shared_library</span><span class="special">::</span><span class="identifier">load</span><span class="special">()</span></code> implementation, unified <code class="computeroutput"><span class="identifier">load_mode</span><span class="special">::</span><span class="identifier">append_decorations</span></code> behavior across platforms
</li>
<li class="listitem">
Renamed <code class="computeroutput"><span class="identifier">shared_library</span><span class="special">::</span><span class="identifier">search_symbol</span><span class="special">()</span></code> to <code class="computeroutput"><span class="identifier">shared_library</span><span class="special">::</span><span class="identifier">has</span><span class="special">()</span></code>
</li>
<li class="listitem">
Dropped support for useless Windows specific <code class="computeroutput"><span class="identifier">load_library_as_</span><span class="special">*</span></code> flags
</li>
<li class="listitem">
Improved error reporting for failed library loads
</li>
<li class="listitem">
Implemented a copy constructor and assignment operator for <code class="computeroutput"><span class="identifier">shared_library</span></code>
</li>
</ul></div>
<h6>
<a name="boost_dll.revision_history.h1"></a>
<span class="phrase"><a name="boost_dll.revision_history.0_2"></a></span><a class="link" href="revision_history.html#boost_dll.revision_history.0_2">0.2</a>
</h6>
<p>
Applied comments from "Boost query interest" mails and Boost Incubator,
implemented new features:
</p>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">
Project was renamed to Boost.DLL.
</li>
<li class="listitem">
Improved docs.
</li>
<li class="listitem">
Added library_info class.
</li>
<li class="listitem">
Aliases macro for explicit specification of sections.
</li>
<li class="listitem">
Aliases now use "boostdll" section.
</li>
<li class="listitem">
Added <code class="computeroutput"><span class="identifier">symbol_location</span><span class="special">()</span></code>
methods.
</li>
<li class="listitem">
Added <code class="computeroutput"><span class="identifier">this_line_location</span><span class="special">()</span></code> method.
</li>
</ul></div>
<h6>
<a name="boost_dll.revision_history.h2"></a>
<span class="phrase"><a name="boost_dll.revision_history.0_1"></a></span><a class="link" href="revision_history.html#boost_dll.revision_history.0_1">0.1</a>
</h6>
<p>
Boost.Plugin 0.1 (Initial Solo Prototype taken from <a href="https://github.com/retf/Boost.Application" target="_top">Boost.Application</a>
with many improvements)
</p>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright © 2014 Renato Tegon Forti, Antony Polukhin<br>Copyright © 2015 Antony Polukhin<br>Copyright © 2016 Antony Polukhin, Klemens Morgenstern<br>Copyright © 2017-2021 Antony Polukhin<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="dependencies.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../boost_dll.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="acknowledgements.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

File diff suppressed because it is too large Load Diff