PCL安装链接直接到boost安装目录

PCL install links directly to boost installation directory somehow

本文关键字:安装 boost 链接 PCL      更新时间:2023-10-16

我有一个非常奇怪的问题与PCL的安装。基本上我已经设置了PCL, boost, cmake, flann等。它都正确地构建和编译。我复制并构建了ICP的例子,它构建得很好。

这就是奇怪的地方。当我运行应用程序时,我得到以下错误:

ldd:FATAL: Could not load library bin.v2/libs/system/build/qcc-4.4.2/
release/threading-multi/libboost_system.so.1.48.0

因此,libboost_system.so.1.48.0存在于/usr/local/lib路径中,甚至更早地被相同的应用程序链接,即。如果我在应用程序上运行ldd,我得到以下链接库信息:

$ ldd iterative_closest_point
./iterative_closest_point:
libboost_system.so => /usr/local/lib/libboost_system.so.1.48.0 (0xb8200000)
libboost_filesystem.so => /usr/local/lib/libboost_filesystem.so.1.48.0 (0xb8209000)
libboost_thread.so => /usr/local/lib/libboost_thread.so.1.48.0 (0xb8225000)
OTHER BOOST
libpcl_common.so.1.7 => /usr/local/lib/libpcl_common.so.1.7.1 (0xb82ea000)
libpcl_octree.so.1.7 => /usr/local/lib/libpcl_octree.so.1.7.1 (0xb838c000)
OTHER PCL
libstdc++.so.6 => /usr/qnx650/target/qnx6/x86/lib/libstdc++.so.6.0.13 (0xb9285000)
libm.so.2 => /usr/qnx650/target/qnx6/x86/lib/libm.so.2 (0xb8774000)
libc.so.3 => /usr/lib/ldqnx.so.2 (0xb0300000)
ldd:FATAL: Could not load library bin.v2/libs/system/build/qcc-4.4.2/release/threading-multi/libboost_system.so.1.48.0

所以我调查了一下PCL到底在找什么,bin.v2是什么?它存在于boost安装目录????中

现在,如果我在boost安装目录ie中使用绝对路径运行程序,它就会变得疯狂。垃圾箱在哪里。V2文件夹存在:

qnx:/root/boost/boost_1_48_0# /root/experiments/checkPCL/iterative_closest_point

它! !程序输出所需的东西。所以我就像,好吧,让我们在这里运行ldd:

qnx:/root/boost/boost_1_48_0# ldd /root/experiments/checkPCL/iterative_closest_point

,我们得到这个:

    libboost_system.so => /usr/local/lib/libboost_system.so.1.48.0 (0xb8200000)
MORE BOOST
libpcl_common.so.1.7 => /usr/local/lib/libpcl_common.so.1.7.1 (0xb82ea000)
MORE PCL
libstdc++.so.6 => /usr/qnx650/target/qnx6/x86/lib/libstdc++.so.6.0.13 (0xb9285000)
libm.so.2 => /usr/qnx650/target/qnx6/x86/lib/libm.so.2 (0xb8774000)
libc.so.3 => /usr/lib/ldqnx.so.2 (0xb0300000)
libboost_system.so.1.48.0 => /root/SMG/extern/libs/boost/boost_1_48_0/bin.v2/libs/system/build/qcc-4.4.2/release/threading-multi/libboost_system.so.1.48.0 (0xb87a7000)
libbz2.so.1.0.4 => /usr/lib/libbz2.so.1.0.4 (0xb87b0000)
libz.so.2 => /proc/boot/libz.so.2 (0xb87c2000)

大的长是到boost文件路径的绝对链接。我不明白PCLldd或任何东西是如何知道这条路径的。

有人知道这是怎么发生的吗?我还需要一些关于如何解决它的解决方案。

EDIT + ADD:

所以最近,我不知道发生了什么变化,但我已经开始得到链接器警告(不是错误):

/usr/qnx650/host/qnx6/x86/usr/bin/ntox86-ld: warning: bin.v2/libs/system/build/
qcc-4.4.2/release/threading-multi/libboost_system.so.1.48.0, needed by
/usr/local/lib/libboost_filesystem.so, not found (try using -rpath or -rpath-link)

所以无论出于什么原因,这肯定是试图链接到bin.v2/.../...,这绝对是疯狂的,我以前从未见过这个?我现在已经搜索了boost安装目录,寻找可能导致这种情况的原因。安装boost的方式没有什么不同寻常的。

作为进一步的说明,我做了一个简单的例子,一个程序,有main,包括和打印"it works",它有以下CMakeLists.txt:

find_package(PCL 1.2 REQUIRED)
find_package(Boost 1.48.0 COMPONENTS system filesystem REQUIRED)
add_executable (test test.cpp)
target_link_libraries(test
   ${BOOST_FILESYSTEM}  #Works
   ${PCL_DEFINITIONS}   #Works
   ${PCL_SEARCH_LIBRARIES} #If i add this it fails!
)

所以看起来PCL和boost相互作用很糟糕,导致了一些真正疯狂的行为!

这可能没有帮助,但我有同样的问题,这是我发现的。这个路径被一些boost库使用。

objdump -x libbost_filessystem -qcc-mt-1_55。因此将显示:

Dynamic Section:
NEEDED               bin.v2/libs/system/build/qcc/release/threading-multi/libboost_system-qcc-mt-1_55.so.1.55.0
NEEDED               libm.so.2
NEEDED               libstdc++.so.6
NEEDED               libc.so.3
INIT                 0x00004d40

注意完整路径。

我在寻找这个问题的解决方案时看到了这篇文章。我很确定这是一个增强构建相关的问题,虽然,我也使用QNX。

如果它在包含bin.v2/libs/system/build/qcc-4.4.2/release/threading-multi/的绝对目录下工作,那么你可能有

  • 设置LD_LIBRARY_PATH设置包括.(当前工作目录)
  • 以某种方式(有几种方式)使用ldconfig添加当前工作目录
总的来说,这是一个坏主意。如果您以root身份运行,这是一个特别糟糕的主意,因为它可以被利用为安全漏洞。

真正的问题似乎仍然是链接器嵌入了libboost_system的完整路径。我不知道是什么原因,但也许

  • 你指定库作为一个具体的源(libboost_system.so.1.48.0而不是-lboost_system在大多数链接器/编译器)
  • 它是某种链接选项(如-rpath ?)

希望能有所帮助