【问题标题】:How do I compile Contraction Hierarchies by KIT?如何通过 KIT 编译收缩层次结构?
【发布时间】:2013-07-14 07:31:50
【问题描述】:

我正在尝试通过 KIT 编译 Contraction Hierarchies Implementation

该软件于 2009 年发布,显然从那时起就没有维护过。由于同时发生了一些变化(使用新的 C++ 标准和编译器版本),代码不再现成编译。

README 在编译指令方面并不是很冗长,它说你应该只调用make。但是,使用 make 会出现以下错误:

g++ -Wall -W -Wno-unused-parameter -O6 -c -o main.o main.cpp
在 /usr/include/c++/4.8/ext/hash_map:60:0 包含的文件中,
                 从命令/../io/../datastr/graph/../../io/serialize.h:26,
                 从命令/../io/../datastr/graph/edge.h:26,
                 从命令/../io/../datastr/graph/graph.h:59,
                 从命令/../io/createGraph.h:28,
                 来自命令/NodeOrder.h:29,
                 来自 main.cpp:35:
/usr/include/c++/4.8/backward/backward_warning.h:32:2: 警告:#warning 此文件包含至少一个已弃用或过时的标头,将来可能会在不另行通知的情况下将其删除。请改用具有等效功能的非弃用接口。有关替换标头和接口的列表,请参阅文件 backward_warning.h。要禁用此警告,请使用 -Wno-deprecated。 [-Wcpp]
 #警告 \
  ^
command/../processing/../EliminationWeight.h:42:35: 错误:对构造函数的调用不能出现在常量表达式中
     静态常量类型 MAX_VALUE = __DBL_MAX__;
                                   ^
command/../processing/../EliminationWeight.h:43:36: 错误:对构造函数的调用不能出现在常量表达式中
     静态常量类型 MIN_VALUE = -__DBL_MAX__;
                                    ^
make: *** [main.o] 错误 1

我需要做什么才能编译?

【问题讨论】:

    标签: c++ gcc compiler-errors g++ compiler-warnings


    【解决方案1】:

    要使软件无错误地编译,需要几个步骤。我已经用 gcc 4.8.1 和 Boost 1.53.0 测试了这些指令。

    对构造函数的调用不能出现在常量表达式中

    (我已经详细回答了这个子问题there,但将在这里重复重要步骤。)

    我们遇到的第一个编译错误是由于软件使用了 GCC 编译器的非标准扩展。似乎在软件开发时这些不需要通过编译器开关启用,但现代 GCC 需要这样做。但是,为了将来的兼容性,我们将摆脱它们并以符合标准的方式实现这些功能。

    编译器告诉我们问题出在EliminationWeight.h 的第42 和43 行。这些是该文件中的行:

    static const Type MAX_VALUE = __DBL_MAX__;
    static const Type MIN_VALUE = -__DBL_MAX__;
    

    GCC 在这里抱怨,因为标准没有涵盖类主体中双精度的初始化。相反,我们应该分开做。所以删除初始化并将行更改为以下内容:

    static const Type MAX_VALUE;
    static const Type MIN_VALUE;
    

    同时删除#include <limits>,因为我们在此文件中不再需要它。

    由于我们还想初始化这些值,所以我们看一下main.cpp 并找到第 84 行及以下内容:

    // doesn't look nice, but required by the compiler (gcc 4)
    const EdgeWeight Weight::MAX_VALUE;
    const EliminationWeight::Type EliminationWeight::MAX_VALUE;
    const EliminationWeight::Type EliminationWeight::MIN_VALUE;
    

    这看起来是进行初始化的理想场所。将第 86 和 87 行更改为包含以下代码:

    const EliminationWeight::Type EliminationWeight::MAX_VALUE = std::numeric_limits< EliminationWeight::Type >::max();
    const EliminationWeight::Type EliminationWeight::MIN_VALUE = -std::numeric_limits< EliminationWeight::Type >::max();
    

    同时添加

    #include <limits>
    

    main.cpp,因为我们现在正在使用该标头中的std::numeric_limits 类。

    collect2:错误:ld 返回 1 个退出状态

    现在可以进行编译,但链接将失败并显示大量错误消息。 (我已经讨论过这个问题there,但会在这里重复它的要点。)

    所有错误都与 Boost::Regex 的链接有关。这是我机器上的完整错误消息:

    g++ -lboost_regex -lboost_iostreams -o main main.o
    main.o: 在函数`boost::re_detail::perl_matcher, std::allocator >>, boost::regex_traits >>::unwind_extra_block(bool)'中:
    。main.cpp中:( text._ZN5boost9re_detail12perl_matcherIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS6_EEENS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE18unwind_extra_blockEb [_ZN5boost9re_detail12perl_matcherIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS6_EEENS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE18unwind_extra_blockEb] + 0x2c上):未定义参考`升压:: re_detail :: put_mem_block(无效*)”
    main.o:在函数 `void boost::re_detail::raise_error > > >(boost::regex_traits_wrapper > > const&, boost::regex_constants::error_type)'中:
    main.cpp中:( text._ZN5boost9re_detail11raise_errorINS_20regex_traits_wrapperINS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEEEEEvRKT_NS_15regex_constants10error_typeE [_ZN5boost9re_detail11raise_errorINS_20regex_traits_wrapperINS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEEEEEvRKT_NS_15regex_constants10error_typeE] + 0x7d):未定义参考`升压:: re_detail :: get_default_error_string(升压:: regex_constants :: ERROR_TYPE)”
    。main.cpp中:( text._ZN5boost9re_detail11raise_errorINS_20regex_traits_wrapperINS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEEEEEvRKT_NS_15regex_constants10error_typeE [_ZN5boost9re_detail11raise_errorINS_20regex_traits_wrapperINS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEEEEEvRKT_NS_15regex_constants10error_typeE] + 0xb1):未定义参考`升压:: re_detail :: raise_runtime_error(标准:: runtime_error常量&)”
    main.cpp中:( text._ZN5boost9re_detail11raise_errorINS_20regex_traits_wrapperINS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEEEEEvRKT_NS_15regex_constants10error_typeE [_ZN5boost9re_detail11raise_errorINS_20regex_traits_wrapperINS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEEEEEvRKT_NS_15regex_constants10error_typeE] + 0xcb):未定义参考`升压:: re_detail :: get_default_error_string(升压:: regex_constants :: ERROR_TYPE)”
    main.o:在函数`__gnu_cxx::__normal_iterator boost::re_detail::re_is_set_member, char, boost::regex_traits >, unsigned int>(__gnu_cxx::__normal_iterator, __gnu_cxx::__normal_iterator, boost::re_detail::re_set_long const* , boost::re_detail::regex_data > > const&, bool)':
    。main.cpp中:( text._ZN5boost9re_detail16re_is_set_memberIN9__gnu_cxx17__normal_iteratorIPKcSsEEcNS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEjEET_SB_SB_PKNS0_11re_set_longIT2_EERKNS0_10regex_dataIT0_T1_EEb [_ZN5boost9re_detail16re_is_set_memberIN9__gnu_cxx17__normal_iteratorIPKcSsEEcNS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEjEET_SB_SB_PKNS0_11re_set_longIT2_EERKNS0_10regex_dataIT0_T1_EEb] + 0x17b):未定义参考`升压:: re_detail :: cpp_regex_traits_implementation :: transform_primary(字符常量*,字符常量*)const的”
    main.cpp中:( text._ZN5boost9re_detail16re_is_set_memberIN9__gnu_cxx17__normal_iteratorIPKcSsEEcNS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEjEET_SB_SB_PKNS0_11re_set_longIT2_EERKNS0_10regex_dataIT0_T1_EEb [_ZN5boost9re_detail16re_is_set_memberIN9__gnu_cxx17__normal_iteratorIPKcSsEEcNS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEjEET_SB_SB_PKNS0_11re_set_longIT2_EERKNS0_10regex_dataIT0_T1_EEb] + 0x4c0):未定义参考`升压:: re_detail :: cpp_regex_traits_implementation ::变换(字符常量*,字符常量*)const的”
    main.o: 在函数`boost::re_detail::perl_matcher, std::allocator >>, boost::regex_traits >>::extend_stack()'中:
    。main.cpp中:( text._ZN5boost9re_detail12perl_matcherIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS6_EEENS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE12extend_stackEv [_ZN5boost9re_detail12perl_matcherIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS6_EEENS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE12extend_stackEv] +为0x18):未定义参考`升压:: re_detail :: get_mem_block()”
    main.o: 在函数`boost::re_detail::perl_matcher, std::allocator >>, boost::regex_traits >>::match_imp()'中:
    。main.cpp中:( text._ZN5boost9re_detail12perl_matcherIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS6_EEENS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE9match_impEv [_ZN5boost9re_detail12perl_matcherIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS6_EEENS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE9match_impEv] +位于0xC):未定义参考`升压:: re_detail :: get_mem_block()”
    。main.cpp中:( text._ZN5boost9re_detail12perl_matcherIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS6_EEENS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE9match_impEv [_ZN5boost9re_detail12perl_matcherIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS6_EEENS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE9match_impEv] + 0x19e):未定义参考`升压:: re_detail :: verify_options(无符号整数,升压:: regex_constants :: _ match_flags)”
    。main.cpp中:( text._ZN5boost9re_detail12perl_matcherIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS6_EEENS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE9match_impEv [_ZN5boost9re_detail12perl_matcherIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS6_EEENS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE9match_impEv] + 0x254):未定义参考`升压:: re_detail :: put_mem_block(无效*)”
    。main.cpp中:( text._ZN5boost9re_detail12perl_matcherIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS6_EEENS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE9match_impEv [_ZN5boost9re_detail12perl_matcherIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS6_EEENS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE9match_impEv] + 0x3c6):未定义参考`升压:: re_detail :: put_mem_block(无效*)”
    main.o: 在函数`bool boost::regex_match, std::allocator, std::allocator > >, char, boost::regex_traits > >(std::basic_string, std::allocator > const&, boost::match_results , std::allocator >::const_iterator, std::allocator > > >&, boost::basic_regex > > const&, boost::regex_constants::_match_flags)':
    。main.cpp中:( text._ZN5boost11regex_matchISt11char_traitsIcESaIcESaINS_9sub_matchIN9__gnu_cxx17__normal_iteratorIPKcSsEEEEEcNS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEEEbRKSbIT2_T_T0_ERNS_13match_resultsINSJ_14const_iteratorET1_EERKNS_11basic_regexISG_T3_EENS_15regex_constants12_match_flagsE [_ZN5boost11regex_matchISt11char_traitsIcESaIcESaINS_9sub_matchIN9__gnu_cxx17__normal_iteratorIPKcSsEEEEEcNS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEEEbRKSbIT2_T_T0_ERNS_13match_resultsINSJ_14const_iteratorET1_EERKNS_11basic_regexISG_T3_EENS_15regex_constants12_match_flagsE] + 0xe9):未定义参考`升压:: re_detail :: perl_matcher,性病::分配器>>,升压:: regex_traits>> :: construct_init(升压:: basic_regex> > const&, boost::regex_constants::_match_flags)'
    main.o:在函数“void Command::createVector(std::string const&, std::vector >&, double)”中:
    main.cpp:(.text._ZN7Command12createVectorIdEEvRKSsRSt6vectorIT_SaIS4_EES4_[_ZN7Command12createVectorIdEEvRKSsRSt6vectorIT_SaIS4_EES4_]+0x4a): 未定义引用`boost::basic_regex > >::do_assign(char const*, char const*, unsigned int)'
    main.cpp:(.text._ZN7Command12createVectorIdEEvRKSsRSt6vectorIT_SaIS4_EES4_[_ZN7Command12createVectorIdEEvRKSsRSt6vectorIT_SaIS4_EES4_]+0x7b): 未定义引用`boost::basic_regex > >::do_assign(char const*, char const*, unsigned int)'
    main.cpp:(.text._ZN7Command12createVectorIdEEvRKSsRSt6vectorIT_SaIS4_EES4_[_ZN7Command12createVectorIdEEvRKSsRSt6vectorIT_SaIS4_EES4_]+0xac):未定义引用`boost::basic_regex > >::do_assign(char const*, char const*, unsigned int)'
    main.o:在函数“void Command::createVector(std::string const&, std::vector >&, unsigned int)”中:
    main.cpp:(.text._ZN7Command12createVectorIjEEvRKSsRSt6vectorIT_SaIS4_EES4_[_ZN7Command12createVectorIjEEvRKSsRSt6vectorIT_SaIS4_EES4_]+0x48): 未定义引用`boost::basic_regex > >::do_assign(char const*, char const*, unsigned int)'
    main.cpp:(.text._ZN7Command12createVectorIjEEvRKSsRSt6vectorIT_SaIS4_EES4_[_ZN7Command12createVectorIjEEvRKSsRSt6vectorIT_SaIS4_EES4_]+0x79): 未定义引用`boost::basic_regex > >::do_assign(char const*, char const*, unsigned int)'
    main.o:main.cpp:(.text._ZN7Command12createVectorIjEEvRKSsRSt6vectorIT_SaIS4_EES4_[_ZN7Command12createVectorIjEEvRKSsRSt6vectorIT_SaIS4_EES4_]+0xaa):更多未定义的对`boost::basic_regex > >::do_assign(char const*, char const*, unsigned int)'的引用
    main.o: 在函数`boost::re_detail::perl_matcher, std::allocator >>, boost::regex_traits >>::match_match()'中:
    main.cpp中:( text._ZN5boost9re_detail12perl_matcherIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS6_EEENS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE11match_matchEv [_ZN5boost9re_detail12perl_matcherIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS6_EEENS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE11match_matchEv] + 0x371):未定义参考`升压::的match_results,性病::分配器>>> :: maybe_assign(升压::的match_results,性病::分配器>>>常量&) '
    main.o: 在函数`boost::re_detail::perl_matcher, std::allocator >>, boost::regex_traits >>::match_dot_repeat_slow()'中:
    。main.cpp中:( text._ZN5boost9re_detail12perl_matcherIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS6_EEENS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE21match_dot_repeat_slowEv [_ZN5boost9re_detail12perl_matcherIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS6_EEENS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE21match_dot_repeat_slowEv] + 0x229):未定义参考`升压:: re_detail :: get_mem_block()”
    collect2:错误:ld 返回 1 个退出状态
    make: *** [main] 错误 1

    似乎根本找不到 Boost::Regex。请注意,这是需要编译并链接到您的应用程序才能工作的 Boost 库之一。以下假设您已经获得了一个编译版本,并且它在您系统的库目录中。

    链接时,通过命令行参数将库和目标文件传递给 GCC 的顺序很重要。出于某种原因,2009 年似乎与 GCC 合作的东西现在不再有效。这可以通过更改 make 将参数传递给 GCC 的顺序来解决。

    在项目根目录下找到Makefile,找到第6行:

    $(CXX) $(LINK) -o $@ $^ $(LIBS)
    

    在这里您可以看到make 在目标文件之前传递了包含 Boost 库的链接器开关。 (如果你不能,别担心。你不必理解 Makefiles 来遵循这个解释。)为了使这个工作与当前的 GCC 一起工作,我们将改变参数的顺序。 Makefile 的第 6 行应如下所示:

    $(CXX) -o $@ $^ $(LIBS) $(LINK)
    

    保存并再次运行make。编译和链接现在应该可以正常进行了。

    警告:#warning 此文件至少包含一个已弃用或过时的标头

    您仍然会看到一个编译器警告,告诉您您正在使用已弃用的头文件。您可以忽略此警告。但是,较新版本的 GCC 可能不附带此头文件,编译会失败。

    如果你想修复它,这里是方法。

    问题在于io/serialize.h,其中包括&lt;ext/hash_map&gt;。 C++11 标准replaces this with unordered_map。所以我们修复了代码以使用它。第 128 行将是

    typedef __gnu_cxx::hash_map<key_type, data_type> HashMap;
    

    将其更改为使用unordered_map,如下所示:

    typedef std::unordered_map<key_type, data_type> HashMap;
    

    现在我们还需要修复标题。删除 &lt;ext/hash_map&gt; 的包含并将第 26 行替换为

    #include <algorithm>
    #include <unordered_map>
    

    &lt;algorithm&gt; 包含是必需的,因为显然&lt;ext/hash_map&gt; 还为hash_map 提供了std::sortstd::reverse。这些函数现在位于 &lt;algorithm&gt; 标头中,并且代码依赖于这些包含在此文件中的事实。

    由于这是一个 C++11 特性,我们需要告诉 GCC 我们想要支持它。进入项目根目录compiler.make,找到第6行,应该是

    CXXFLAGS = $(DEBUG) $(WARNING) $(OPTIMIZER)
    

    在行尾添加使用 C++11 的开关:

    CXXFLAGS = $(DEBUG) $(WARNING) $(OPTIMIZER) -std=c++11
    

    再次运行make cleanmake,您的代码应该可以编译而不会出现任何错误或警告。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-21
      • 2021-06-24
      • 2013-12-06
      • 1970-01-01
      • 2015-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多