链接到本地 qpid-proton-cpp 安装

问题描述 投票:0回答:1

我想使用一个库在 C++ 中使用 AMQP 1.0 进行通信。

Qpid-protonGithub-mirror)似乎是可行的方法,并且在按照常规安装进行操作时,将其链接到我的项目没有任何问题。

但是我想避免定期安装该库,因为它是在计算机上全局安装的。相反,选择我的项目可能链接到的本地安装。 这似乎也很容易做到,因为可以在生成 cmake 文件时设置 CMAKE_INSTALL_PREFIX 变量,并在我的项目自己的 cmakelists 文件中设置 ProtonCpp_DIR 变量。

我的项目似乎没有链接到原始的 Proton 库,因为它找不到核心库文件,也找不到 proactor 库文件。 对生成的可执行文件使用 ldd 会显示

libqpid-proton-proactor.so.1 => not found
libqpid-proton-core.so.10 => not found

在我的 cmake 中链接质子项目似乎也没有改变任何东西。

所以我需要问,我在这里错过了什么?我觉得这应该有用吗?

这里我提供我的项目当前的cmakeLists文件

cmake_minimum_required(VERSION 3.16)

project(proton_test C CXX)
set(ProtonCpp_DIR "local_install/lib/cmake/ProtonCpp")
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_EXTENSIONS OFF)

find_package(ProtonCpp REQUIRED)

add_executable(main main.cpp)

# Link the Qpid Proton C++ library
target_link_libraries(main PRIVATE Proton::cpp)

有关此设置的更多详细信息,我准备了一个 repo,其中包含导致构建链接失败的说明。

c++ cmake qpid-proton
1个回答
0
投票

您本地安装的

libqpid-proton-cpp
没有设置“rpath”。如果你运行
ldd
你会得到:

$ ldd local_install/lib/libqpid-proton-cpp.so
    linux-vdso.so.1 (0x00007fff402dd000)
    libqpid-proton-proactor.so.1 => not found
    libqpid-proton-core.so.10 => not found
    libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007113e0800000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007113e0b22000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007113e0400000)
    /lib64/ld-linux-x86-64.so.2 (0x00007113e0bcb000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007113e0717000)

解决此问题(安装后)的一种方法是使用

patchelf
确认缺少 rpath,并设置一个。

$ patchelf --print-rpath local_install/lib/libqpid-proton-cpp.so

$ patchelf --set-rpath `pwd`/local_install/lib local_install/lib/libqpid-proton-cpp.so

$ patchelf --print-rpath local_install/lib/libqpid-proton-cpp.so
/tmp/qpid-test/local_install/lib

$ ldd build/main
    linux-vdso.so.1 (0x00007fffdd519000)
    libqpid-proton-cpp.so.12 => /tmp/qpid-test/local_install/lib/libqpid-proton-cpp.so.12 (0x00007171e15cf000)
    libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007171e1200000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007171e1594000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007171e0e00000)
    libqpid-proton-proactor.so.1 => /tmp/local_install/lib/libqpid-proton-proactor.so.1 (0x00007171e157e000)
    libqpid-proton-core.so.10 => /tmp/local_install/lib/libqpid-proton-core.so.10 (0x00007171e1528000)
    /lib64/ld-linux-x86-64.so.2 (0x00007171e1654000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007171e1117000)
    libssl.so.3 => /lib/x86_64-linux-gnu/libssl.so.3 (0x00007171e147e000)
    libcrypto.so.3 => /lib/x86_64-linux-gnu/libcrypto.so.3 (0x00007171e0800000)

$ build/main
Container start
Container stopped...
proton:io: Connection refused - disconnected 127.0.0.1:5672

显然,安装后“打补丁”

libqpid-proton-cpp
并不理想。这听起来像是一个错误,或者只是他们链接过程中的疏忽,而且他们没有考虑 CMAKE_INSTALL_PREFIX。我还没有研究过他们到底在做什么,但我会在那里提出一个问题。

顺便说一句,在 macOS 上一切正常。

$ otool -L main
main:
    @rpath/libqpid-proton-cpp.12.dylib (compatibility version 12.0.0, current version 12.13.0)
    /opt/homebrew/opt/llvm/lib/c++/libc++.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1351.0.0)

$ ./main
Container start
Container stopped...
proton:io: connection refused - connecting to 127.0.0.1:5672
© www.soinside.com 2019 - 2024. All rights reserved.