链接较新的库而不是旧的库

时间:2015-08-13 14:09:48

标签: c++ linker makefile shared-libraries point-cloud-library

我正在尝试从源代码(http://pointclouds.org/)编译Point Cloud Library。运行cmake和make后,我收到以下链接错误:

Linking CXX executable ../../bin/pcl_convert_pcd_ascii_binary
../../lib/libpcl_io.so.1.7.2: undefined reference to `png_set_longjmp_fn'

作为一个新手,我不确定这个错误意味着什么,但我假设:它正在尝试构建的可执行文件plc_convert_pcd_ascii_binary需要链接到库libpcl_io.so.1.7.2,但是这个库包含函数png_set_longjump_fun,找不到这个函数的定义?

所以,我尝试在Stack Overflow上查看了一些类似的问题,结果发现png_set_longjump_fun包含在libpng库中,但仅在libpng-1.4.x之后引入。运行dpkg -l | grep libpng*后,我得到以下输出:

ii  libpng12-0:amd64                                      1.2.50-1ubuntu2                                     amd64        PNG library - runtime
ii  libpng12-dev                                          1.2.50-1ubuntu2                                     amd64        PNG library - development

所以看起来我需要从libpng12-dev升级到至少libpng14-dev。在libpng网站上,我看到我可以下载最新版本的源代码(但我可以通过apt-get获得的最新版本仅为libpng12-dev)。但我担心如果我通过apt-get安装了一个版本,并且手动安装了另一个版本,则可能存在一些冲突。但是,如果存在依赖于此但与新版本不兼容的软件包,则卸载libpng12-dev可能会导致问题。

因此,我想知道的是,我是否应该卸载/清除libpng12-dev,然后手动安装新版本,或者只是在保留旧版本的同时安装新版本。如果我做后者,我怎么能确定我正在尝试编译的PCL二进制文件将链接到这个新库而不是旧库?

谢谢:)

1 个答案:

答案 0 :(得分:0)

如果您从源代码编译,则可能甚至不需要安装。编译完libpng后,在编译PCL指向libpng构建树中的正确位置时设置CMAKE_PREFIX_PATH。这通常是用cmake完成的,所以应该在这种情况下工作。更多信息:

http://www.cmake.org/cmake/help/v3.0/variable/CMAKE_PREFIX_PATH.html

https://blogs.kde.org/2008/12/12/how-get-cmake-find-what-you-want-it

cmake - find_library - custom library location

How to point cmake at specific directory for library?