我想使用一个库在 C++ 中使用 AMQP 1.0 进行通信。
Qpid-proton(Github-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,其中包含导致构建链接失败的说明。
您本地安装的
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