【问题标题】:Linking to shared boost library giving headaches链接到共享的 boost 库让人头疼
【发布时间】:2016-12-14 13:48:52
【问题描述】:

我有一个听起来很简单的问题,但我觉得我已经尽了一切努力来解决它,但我没有想法。

我有一个我写的程序,它使用 boost/program_options.hpp 使用 include 语句

#include <boost/program_options.hpp>

这个程序可以在我的笔记本电脑上运行,现在我正试图将它放到我没有 sudo 权限的服务器上。在我的笔记本电脑上,我有 1.56 和 1.58 的 boost 版本,在我找到的服务器上,我找到了 1.53.0。我没有安装或构建它。

服务器上存在的共享库文件是: /usr/lib64/libboost_program_options.so.1.53.0

在上面运行 ldd 会给我输出:

 ldd /usr/lib64/libboost_program_options.so.1.53.0
 linux-vdso.so.1 =>  (0x00007ffc54a63000)
 libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007fc0dcad8000)
 libm.so.6 => /lib64/libm.so.6 (0x00007fc0dc7d5000)
 libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fc0dc5bf000)
 libc.so.6 => /lib64/libc.so.6 (0x00007fc0dc1fe000)
 /lib64/ld-linux-x86-64.so.2 (0x00007fc0dd071000)

我认为这意味着它已找到所有依赖项。

我已经创建了一个指向我的主目录的符号链接以创建 libboost_program_options.so 链接,我猜这意味着 -lboost_program_options 链接器标志应该可以工作。

我的编译方式是:

g++ -L/home/homeDir code.cpp -o code.o -std=c++11 -Wall -lboost_program_options

我得到的只是:

fatal error: boost/program_options.hpp: No such file or directory
 #include "boost/program_options.hpp"
                                     ^
compilation terminated.

我用引号和 试过这个,没有“boost/”等,但我总是得到同样的抱怨。我认为这意味着它找到了库,因为没有关于 -lboost_program_options 标志的投诉?

虽然它可以在我的机器上运行,但我可能根本没有使用共享程序选项库。在我的笔记本电脑上,我的库路径中有一个静态版本的 libboost_program_options,它可能正在使用,还有一个库外部的 program_options.hpp 标头,它可能位于我的包含路径中。我觉得我应该能够使用服务器上的共享库,而不是第 5 次惹恼服务器管理员(这些东西在这里工作得非常缓慢)。

如果这是我的疏忽,我很抱歉。我对 boost 还很陌生,但我觉得我目前已经尝试了一切来解决这个问题。

我会很高兴有任何关于如何改变它的建议......或者如果我只是在使用共享库方面有点愚蠢。

提前致谢。

编辑: 经过更多的研究,我觉得我只是对静态库和共享库感到困惑。我试图在编译时链接一个共享库,我想这没有意义。还包括在编译时不应该链接的东西的头文件没有什么意义。我的代码显然是为静态库设计的。

【问题讨论】:

  • g++ -I/usr/include -L/usr/lib64 -lboost_program_options -std=c++11 ...
  • 您的服务器可能没有program_options.hpp,它应该在某个名为 boost_program_options_devel 的包中。
  • 是的,这是我的问题。我以为没有它我也能过得去,但事实似乎并非如此。我现在刚刚在我的笔记本电脑上链接到一个静态版本的程序选项,并且正在使用服务器上的可执行文件。到目前为止它正在工作..但我觉得我也应该能够让它在服务器上编译。我现在已经下载了头文件,它决定它找不到 libboost_program_options.so 虽然我已经创建了一个符号链接到我正在运行的同一目录中......有趣 ^^

标签: c++ boost shared-libraries boost-program-options


【解决方案1】:

错误消息是由没有找到 Boost 头文件的预编译器产生的(正如它在错误消息中所说的那样)。您需要设置正确的包含路径(-I...),找到Boost库头文件,显然它们不在/usr/include下。

必须相应地指定 Boost 库 (-L...) 的路径。

最后:如果您要链接系统上的 Boost 共享库,那么您应该使用与服务器上安装的相同版本的 Boost。否则,链接到静态库,这可能会使您的可执行文件更大,但它会在任何服务器上运行,无论安装在那里的 Boost 版本(甚至没有)。

【讨论】:

  • 所以要澄清一下,要使用 boost 程序选项,我需要某处的头文件和共享库对象?我认为共享库对象可能包含头文件和我要调用的函数的代码。我之前没有明确使用过共享库......当我切换到服务器时我正在重新编译,但最好只链接到我系统上的静态库并使用服务器上的可执行文件。这可能会减轻很多痛苦。
  • 谢谢,我刚刚下载了头文件,现在我遇到了一个错误,我可以更好地处理。找不到 -lboost_program_options。奇怪的是对一个错误感到高兴。但至少我以前在网上的某个地方见过这个。
  • 编译需要头文件和共享库。要运行该程序,您只需要共享库。实际上,如果确实需要共享库中的符号,您只需要共享库,Boost 库中的很多东西只在头文件中,因此直接编译到您的可执行文件中。
  • 谢谢。我正在使用 program_options,它也已编译。所以我最终需要共享库。现在处理为什么它找不到它......但我已经解决了我最初的问题。我有一个解决方法,可以将可执行文件通过静态链接和传送到服务器上。所以我很高兴......学到了很多东西并得到了一些有用的东西:)。
【解决方案2】:

sudo apt install libboost-program-options-dev

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 2011-03-31
    相关资源
    最近更新 更多