我在安装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文件路径的绝对链接。我不明白PCL
或ldd
或其他任何事情可以了解这条道路。
有没有人对如何发生这种情况有任何想法?我还需要一些解决方法来解决它。
编辑+添加:
所以最近,我不确定发生了什么变化,但我已经开始接收链接器警告(不是错误):
/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和提升正在严重相互作用并导致一些真正的疯狂行为!
答案 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
?)希望这有帮助