<h3>说明</h3>
<p>这个问题是由混合使用<em><code>libc++</code></em>编译的对象和使用<em><code>libstdc++</code></em>编译的对象引起的。</p>
<p>在我们的例子中,库<code>myMod.so</code>(用<em><code>libstdc++</code></em>编译)需要<code>boost-python</code>用<em><code>libstdc++</code></em>编译(从现在起<code>boost-python-libstdc++</code>)。当<code>boost-python</code>是<code>boost-python-libstdc++</code>时,它将工作正常。否则-在它的<code>boost-python</code>已经用<em><code>libc++</code></em>编译过的计算机(或另一个c++库)上,它将在加载和运行它时遇到问题。</p>
<p>在我们的例子中,发生这种情况的原因是开发人员故意更改了所有符号的名称,以防止您(并保护您)混合来自他们库的代码和来自不同库的代码:<code>myMod.so</code>需要一个从类型中获取参数的函数。在<code>libc++</code>中,此类型的名称为<code>std::__1::pair</code>。因此,未找到此符号。</p>
<p>要理解为什么混合同一API的两个版本是不好的,请考虑以下情况:有两个库:<code>Foo</code>和<code>Bar</code>。它们都有一个接受<code>std::string</code>并将其用于某些用途的函数,但是它们使用不同的c++库。当由<code>Foo</code>创建的<code>std::string</code>将被传递给<code>Bar</code>时,<code>Bar</code>将认为这是其c++库的<code>std::string</code>的一个实例,然后会发生不好的事情(它们是完全不同的对象)。</p>
<p><strong>注意</strong>:在某些情况下,同一个API的两个或多个不同版本在程序的完全不同的部分不会有问题。如果它们将在它们之间传递此API的对象,就会出现问题。但是,检查这一点可能非常困难,特别是当它们仅作为另一个对象的成员传递API对象时。此外,库的初始化函数可以执行不应该发生两次的操作。另一个版本可能会再次执行这些操作。</p>
<h3>怎么解决?</h3>
<ul>
<li><p>您始终可以重新编译库并使它们彼此匹配。</p></li>
<li><p>您可以将<code>boost-python</code>作为静态库链接到库。然后,它将在几乎每台计算机上工作(即使是没有安装<code>boost-python</code>的计算机)。查看有关<a href="http://www.boost.org/doc/libs/1_61_0/libs/python/doc/html/building/choosing_a_boost_python_library_.html#ftn.building.choosing_a_boost_python_library_.the_dynamic_binary.f0" rel="noreferrer">here</a>的详细信息。</p></li>
</ul>
<h3>小结</h3>
<p><code>myMod.so</code>需要另一个版本的<code>boost-python</code>,它是用特定的c++库编译的。因此,它不适用于任何其他版本。</p>