虽然文件存在,但编译的C ++程序在另一个系统上引发“无法打开共享对象文件”

时间:2010-11-02 13:46:52

标签: c++ linux linker g++ libraries

我写了一个小程序,需要一些库,包括libboost_filesystem,libboost_program_options和libcurl。

我在家用机器上编译它并将二进制文件带到我的计算机上进行测试。但是当我尝试启动程序时,它会出现以下错误消息:

error while loading shared libraries:
libboost_filesystem.so.1.42.0: cannot
open shared object file

但是当我搜索这个文件时,我发现它存在于: /usr/lib/libboost_filesystem.so.1.42.0

在我的程序编译/链接过程中出了什么问题?如果是,我需要做些什么才能使其在其他机器上运行?

6 个答案:

答案 0 :(得分:7)

首先,尝试在控制台中发出ldconfig -p | grep libboost_filesystem.so以确保该库位于您的ld缓存中。

如果不是,您可能需要在 /etc/ld.so.conf.d 目录中添加名称如 boost.conf 的文件。该文件应包含boost库的路径。然后运行sudo ldconfig以更新系统的ld缓存。

希望这会有所帮助......

答案 1 :(得分:1)

您是否编译了boost的共享二进制文件并将其提供给用户?

通常可以在没有任何二进制/共享的情况下使用boost。但是,如果您使用boost :: filesystem,则必须构建二进制文件,如lib或共享对象,并确保它可用于最终的可执行共享二进制搜索路径。

您可以在增强文档中找到解释和更多详细信息。这是linux版本:http://www.boost.org/doc/libs/1_44_0/more/getting_started/unix-variants.html

从这个页面:

  

大多数Boost库都是仅限标题的:   它们完全由头文件组成   包含模板和内联   功能,并要求不   单独编译的库二进制文件   或链接时的特殊处理。

...

  

唯一必须的Boost库   另外建立的是:

     
      
  • Boost.Filesystem
  •   
  • Boost.GraphParallel
  •   
  • Boost.IOStreams
  •   
  • Boost.MPI
  •   
  • Boost.ProgramOptions
  •   
  • Boost.Python(见   Boost.Python构建文档   在构建和安装之前)
  •   
  • Boost.Regex
  •   
  • Boost.Serialization
  •   
  • Boost.Signals
  •   
  • Boost.System
  •   
  • Boost.Thread
  •   
  • Boost.Wave
  •   

答案 2 :(得分:1)

看起来您需要静态链接库。这是一个很好的解释。 Boost static linking

答案 3 :(得分:1)

您是否链接了相同版本的boost_filesystem库?根据编译应用程序的方式,它需要存在相同版本的库。

您可以尝试使用以下方法检查应用程序实际查找的内容:

ldd <your app name>

也可以检查你的LD_LIBRARY_PATH环境变量。

答案 4 :(得分:1)

您能否确保/usr/lib/libboost_filesystem.so.1.42.0不是死链接?

答案 5 :(得分:1)

是LD_LIBRARY_PATH环境变量中的/ usr / lib吗?