【问题标题】:boost::variant linker error with gcc使用 gcc 的 boost::variant 链接器错误
【发布时间】:2012-07-01 10:07:01
【问题描述】:

我有点疯了,试图弄清楚为什么以下代码无法编译:

#include <iostream>
#include <array>
#include <boost/variant.hpp>
#include <forward_list>

typedef unsigned long long very_long;
typedef boost::variant< int, std::string > variants_type;
typedef std::array< variants_type, 5 > row_type;
typedef std::forward_list<row_type> rows_holder_type;

int main() {

    rows_holder_type rows;
    row_type row_data;

    row_data[0] = 0;
    row_data[1] = 0;
    row_data[2] = 0;
    row_data[3] = 0;
    row_data[4] = 0;

    rows.push_front(row_data);
}

这是我得到的编译器错误:

/usr/include/testing/test_code.o||在函数'std::array&lt;boost::variant&lt;int, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_&gt;, 5ul&gt;::array(std::array&lt;boost::variant&lt;int, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_&gt;, 5ul&gt; const&amp;)':|
。store.cpp :( text._ZNSt5arrayIN5boost7variantIiSsNS0_6detail7variant5void_ES4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_EELm5EEC2ERKS6 _ [_ _ ZNSt5arrayIN5boost7variantIiSsNS0_6detail7variant5void_ES4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_EELm5EEC5ERKS6] + 0X31)||未定义参照'boost::variant&lt;int, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_&gt;::variant(boost::variant&lt;int, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_&gt; const&amp;)' |,点击 ||=== 构建完成:1 个错误,0 个警告 ===|

如果我替换:

typedef boost::variant< int, std::string > variants_type;

与:

typedef boost::any variants_type;

代码可以编译,但出于性能原因,我不想使用 boost::any。

【问题讨论】:

  • 它确实编译,这是一个链接器错误。
  • 关于如何修复它的任何建议?正如我们所说,我正在谷歌搜索如何修复链接器错误,但尚未遇到解决方案。
  • '不怕。我从未使用过boost::variant。很多提升的东西只是标题,所以不需要链接任何东西,但不是所有东西。 boost::regex 就是一个例子,你需要构建一个库然后与之链接。
  • 我猜链接器错误是因为 boost::variant 不是“完整类型”并且 std::array (像大多数标准库头文件一样)需要完整类型。
  • @Aditya : boost::variant&lt;&gt; 不是这里怎么可能是一个完整的类型?

标签: c++ gcc boost c++11 boost-variant


【解决方案1】:

我使用 MSVC 和 gcc 4.7.0 测试了您的代码。 MSVC 可以很好地编译和链接代码(当然是 #include &lt;string&gt;),但 gcc 在最后一行 rows.push_front(row_data); 上给出了链接器错误。如果您注释掉该行,gcc 将接受该代码。我看不出为什么 gcc 会给出链接器错误,并得出结论认为这是 gcc 的错误。 gcc 的一种解决方法是将std::array 更改为std::vector

(根据错误消息,我假设您正在使用 Code::Blocks 和 gcc)

我已经消除了额外的代码,下面的例子仍然给出了链接器错误:

#include <boost/variant.hpp>
#include <array>

int main()
{
    std::array<boost::variant<int, double>, 5> row_type1;
    std::array<boost::variant<int, double>, 5> row_type2 = row_type1;
}

【讨论】:

  • 这真的很奇怪。我可以发誓我以前在数组中使用过类似的东西。目前,您的矢量“修复”正在起作用。
  • Clang 3.1 在生成可链接输出时没有问题。
  • 我将把它标记为正确答案,因为它确实“修复”了编译错误。但是,我仍然认为必须有一些方法来解决这个问题。
【解决方案2】:

你错过了#include &lt;string&gt;;除了你的代码很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    相关资源
    最近更新 更多