【问题标题】:"error: changes meaning" when installing Apache qpid安装 Apache qpid 时出现“错误:更改含义”
【发布时间】:2017-02-04 02:51:47
【问题描述】:

我正在尝试在 SUSE linux 系统上安装 qpid proton 0.14.0 库,以便将 AMQP 消息传递集成到大型 c++ 程序中。安装需要调用“cmake”和“make all”。调用“make all”后,构建完成 32%,然后抛出错误:

Scanning dependencies of target qpid-proton-cpp
[ 32%] Building CXX object proton-c/bindings/cpp/CMakeFiles/qpid-proton-cpp.dir/src/connection.cpp.o
In file included from {Install_dir}/proton-c/bindings/cpp/include/proton/./././link.hpp:31,
                 from {Install_dir}/proton-c/bindings/cpp/include/proton/././receiver.hpp:27,
                 from {Install_dir}/proton-c/bindings/cpp/include/proton/./session.hpp:27,
                 from {Install_dir}/proton-c/bindings/cpp/include/proton/connection.hpp:28,
                 from {Install_dir}/proton-c/bindings/cpp/src/connection.cpp:24:
{Install_dir}/proton-c/bindings/cpp/include/proton/././././sender_options.hpp:87: error: declaration of ‘proton::sender_options& proton::sender_options::delivery_mode(proton::delivery_mode)’
{Install_dir}/proton-c/bindings/cpp/include/proton/./././././delivery_mode.hpp:30: error: changes meaning of ‘delivery_mode’ from ‘struct proton::delivery_mode’
In file included from {Install_dir}/proton-c/bindings/cpp/include/proton/./././link.hpp:32,
                 from {Install_dir}/proton-c/bindings/cpp/include/proton/././receiver.hpp:27,
                 from {Install_dir}/proton-c/bindings/cpp/include/proton/./session.hpp:27,
                 from {Install_dir}/proton-c/bindings/cpp/include/proton/connection.hpp:28,
                 from {Install_dir}/proton-c/bindings/cpp/src/connection.cpp:24:
{Install_dir}/proton-c/bindings/cpp/include/proton/././././receiver_options.hpp:83: error: declaration of ‘proton::receiver_options& proton::receiver_options::delivery_mode(proton::delivery_mode)’
{Install_dir}/proton-c/bindings/cpp/include/proton/./././././delivery_mode.hpp:30: error: changes meaning of ‘delivery_mode’ from ‘struct proton::delivery_mode’
make[2]: *** [proton-c/bindings/cpp/CMakeFiles/qpid-proton-cpp.dir/src/connection.cpp.o] Error 1
make[1]: *** [proton-c/bindings/cpp/CMakeFiles/qpid-proton-cpp.dir/all] Error 2
make: *** [all] Error 2

研究“从 'struct proton::delivery_mode' 错误中更改 'delivery_mode' 的含义让我相信这是一个与结构同名的构造函数有关的问题。我包括了 Deliver_mode下面的结构声明。关于如何安装这些库有什么想法吗?谢谢!

namespace proton {

/// The message delivery policy to establish when opening a link.
/// This structure imitates the newer C++11 "enum class" so that
/// The enumeration constants are in the delivery_mode namespace.
struct delivery_mode {
    /// Delivery modes
    enum modes {
        /// No set policy.  The application must settle messages
        /// itself according to its own policy.
        NONE = 0,
        /// Outgoing messages are settled immediately by the link.
        /// There are no duplicates.
        AT_MOST_ONCE,
        /// The receiver settles the delivery first with an
        /// accept/reject/release disposition.  The sender waits to
        /// settle until after the disposition notification is
        /// received.
        AT_LEAST_ONCE
    };

    /// @cond INTERNAL

    delivery_mode() : modes_(NONE) {}
    delivery_mode(modes m) : modes_(m) {}
    operator modes() { return modes_; }

    /// @endcond

  private:
    modes modes_;
};

}

【问题讨论】:

  • 没有看到 proton::receiver_options 或 proton::sender_options,它们在哪里?

标签: c++ installation qpid


【解决方案1】:

这是 GCC 版本的问题。某些版本的 GCC 将这种情况视为错误,您必须使用其中一个版本。一种解决方案是通过专门引用类型proton::delivery_mode 来解决歧义。我在构建互操作测试时也遇到了问题,我修复了这个问题。我仍然无法构建我想要的 Python 绑定,但 Proton 本身通过以下更改构建。如果我发现 Python 绑定问题,我会更新这个答案。

diff --git a/proton-c/bindings/cpp/include/proton/receiver_options.hpp b/proton-c/bindings/cpp/include/proton/receiver_options.hpp
index 413e4d4..111865d 100644
--- a/proton-c/bindings/cpp/include/proton/receiver_options.hpp
+++ b/proton-c/bindings/cpp/include/proton/receiver_options.hpp
@@ -70,7 +70,7 @@ class receiver_options {
     PN_CPP_EXTERN receiver_options& handler(class messaging_handler&);

     /// Set the delivery mode on the receiver.
-    PN_CPP_EXTERN receiver_options& delivery_mode(delivery_mode);
+    PN_CPP_EXTERN receiver_options& delivery_mode(proton::delivery_mode);

     /// Automatically accept inbound messages that aren't otherwise
     /// released, rejected, or modified (default is true).
diff --git a/proton-c/bindings/cpp/include/proton/sender_options.hpp b/proton-c/bindings/cpp/include/proton/sender_options.hpp
index 9d7bb42..58a42cb 100644
--- a/proton-c/bindings/cpp/include/proton/sender_options.hpp
+++ b/proton-c/bindings/cpp/include/proton/sender_options.hpp
@@ -74,7 +74,7 @@ class sender_options {
     PN_CPP_EXTERN sender_options& handler(class messaging_handler&);

     /// Set the delivery mode on the sender.
-    PN_CPP_EXTERN sender_options& delivery_mode(delivery_mode);
+    PN_CPP_EXTERN sender_options& delivery_mode(proton::delivery_mode);

     /// Automatically settle messages (default is true).
     PN_CPP_EXTERN sender_options& auto_settle(bool);
diff --git a/proton-c/bindings/cpp/src/interop_test.cpp b/proton-c/bindings/cpp/src/interop_test.cpp
index de6ae63..a383b26 100644
--- a/proton-c/bindings/cpp/src/interop_test.cpp
+++ b/proton-c/bindings/cpp/src/interop_test.cpp
@@ -33,6 +33,7 @@ namespace {
 using namespace std;
 using namespace proton;

+using proton::codec::get;
 using proton::codec::encoder;
 using proton::codec::decoder;

【讨论】:

    猜你喜欢
    • 2015-04-03
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 2019-08-01
    • 2019-03-08
    相关资源
    最近更新 更多