PCL安装链接直接以某种方式提升安装目录

时间:2014-05-06 04:19:45

标签: c++ boost point-cloud-library

我在安装PCL时遇到了一个非常奇怪的问题。基本上我已经设置了PCL,boost,cmake,flann等等。它都可以正确构建和编译。我复制并构建了ICP example,它构建得很好。

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

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安装目录的绝对路径运行程序,那么它就变得疯狂了。 bin.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或其他任何事情可以了解这条道路。

有没有人对如何发生这种情况有任何想法?我还需要一些解决方法来解决它。

编辑+添加:

所以最近,我不确定发生了什么变化,但我已经开始接收链接器警告(不是错误)

/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和提升正在严重相互作用并导致一些真正的疯狂行为!

2 个答案:

答案 0 :(得分:4)

这可能没有用,但我有同样的问题,这就是我找到的。某些boost库使用该路径。

objdump -x libbost_filesystem-qcc-mt-1_55.so将显示:

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。

答案 1 :(得分:3)

如果它来自包含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?)

希望这有帮助